Monthly Archives: March 2006

Ray's Boathouse Restaurant (Seattle, WA)

Rating:

March almost passed me by without my noticing that it was a Twenty-Five for $25 month. We’re managing to slide into home in the last two days of the promotion at Ray’s and then tonight at Restaurant Zoe.

Mike showing off the salmonThe last time I was at Ray’s was in 1998, and I had memories of a gorgeous view of the Olympic mountains and great seafood dining. Things have changed. The restaurant is now on the shore just south of Golden Gardens (even more of a schlep than Ballard), upped their prices, and (with the notable exception of their salmon chowder) the food was forgettable.

The promotional menu had lots of choices and with roaming forks I sampled a few dishes for each course. Appetizers included the salmon chowder, a savory cheesecake, and tuna tartare. The chowder was the best I’ve had in Seattle: not too creamy, with a full salmon flavor and bacon-free (so LL was able to partake). The cheesecake was a nice change of pace (lots of cheese and bacon), but the tartare was chewy and tasteless. The kind you might get at a tourist trap venue.

So-so halibut with tasty tomatoesSecond course: I was excited about the halibut, as the Alaskan season has just started and the description was mouth-watering. Unfortunately the only tasty pieces of this nice-looking plate were the juicy fresh tomatoes. The halibut was flavorless, and overcooked. Halibut at its finest is light and flaky and I savor that texture. Perhaps my expectations were too high, but at a menu price of $25.95 in a restaurant supposedly “best of breed” for local seafood I must say it was a disappointment. Mike’s salmon was respectable, and the pesto sauce complemented the natural grilled flavors nicely.

25 for $25 is a great indulgence for your sweet tooth since every list involves an (effectively) free dessert. We tried one of each: Earl Grey crème brulée, coconut cake with fresh fruit, and “strawberry float”. The only one worth a second taste was the crème brulée, and most of its praise is by comparison with the lackluster alternatives. They did make for a nice picture though:

The ladies showing off a trio of desserts

Overall, great company and great chowder, but I won’t be coming back for awhile. I’m looking forward to the contrast tonight when LL and I introduce DeAnn to Zoe’s.

Ray’s Boathouse Restaurant
6049 Seaview Avenue NW
Seattle, WA 98107

Demystifying HostNameComparisonMode: Wildcards, and URI Matching

Today I was asked “what is StrongWildcard and WeakWildcard, and which one should I use?”. The piece of object model that my co-worker is asking about is:

public enum HostNameComparisonMode
{
StrongWildcard = 0,
Exact = 1,
WeakWildcard = 2,

}

Most bindings have a HostNameComparisonMode property on them. This property is used for service-side endpoints (IChannelListener), in conjunction with the ListenUri of that endpoint. The values are semantics similar to + and * for http.sys registrations. “Wildcard” vs. “Exact” refers to how we match the authority (hostname+port) piece of an incoming Uri. For “Wildcard”, anything matches. For “Exact”, we perform a case-insensitive string comparison to determine equality.

“Strong” vs. “Weak” has to do with the relative priorities of endpoints. We use three longest-prefix-match tables, one each for StrongWildcard, Exact, and WeakWildcard. When a Message comes into the system, we first try to match the Uri against our Strong table (which uses a wildcard comparison on hostname+port). If nothing matches, we try the Exact table (using a case-insensitive exact comparison on hostname+port). Lastly, if there was no match on Strong or Exact, we check the Weak table (again using a wildcard match for hostname+port).

For example, let’s say you have the following endpoints registered on your machine:

  1. (http://foo.com/a/b/c/, StrongWildcard)
  2. (http://foo.com/a/b/, Exact)
  3. (http://bar.com/, Exact)
  4. (http://foo.com/a/, WeakWildcard)

A request coming in for http://foo.com/a/b/c/d/ will match (1).

A request for http://foo.com/a/b/ will match (2) since the strong comparison fails (/a/b/c/ is not a prefix of /a/b/).

A request for http://foo.com/a/d/ will match (4). Even though “/” is a prefix match of “/a/d/” for (3), the hostnames differ and so the Exact match will fail.

Lastly, a request for http://bar.com/a/b/ will match (3). (2) is a prefix match but the hostnames differ, and (3) takes precedence over (4) in priority order.

Hopfully this helps demystify our endpoint URI matching process!

Café Crêpe (Seattle, WA)

Rating:

LL with dessertFor the past few Tuesdays Lauren and I have been taking a “Big Fat Jewish Wedding” class at UW Hillel. Our weekly tradition includes a pre-class meal in the U-District. Last week on our way to Caspian Grill we saw that a Café Crêpe had opened on the Ave. This is part the same mini-chain from Vancouver that have a number of branches around Robson St. I had enjoyed those in the past so tonight we stopped in before class.

Overall is was so-so. The service was friendly and quick, though there is zero ambiance in the place — just some empty white tables in a sterile undecorated room. We chose a spinach, mushroom, and emmenthal crêpe from the very small menu. The mushrooms were raw, the crêpe itself was too thick, the one saving grace was gooey melted emmenthal.

The dessert crêpe (strawberries and chocolate) was better, though again the crêpe was too thick. But it was strawberries and chocolate and so we polished it off 🙂

Café Crêpe would do in a pinch, but I’ll be continuing my search for a good Seattle “fast crêpe” (a la Crêpes A-Go-Go).

Café Crêpe
4508 University Way NE
Seattle, WA 98105

UPDATE: Café Crêpe has closed this location (seems I wasn’t the only one with a ho-hum experience)

Gorditos (Seattle, WA)

Rating:

Three things to know about Gorditos: Arguably the best burritos in Seattle, prices are cheap, and portions are HUGE. They are famous for the portion sizes: like grande burritos the size of a small child (if you go they have a picture to prove it).

I’ve heard about Gorditos for years from numerous friends, and they always get a dreamy look in their eyes as they talk about it. But I don’t find myself in Greenwood very often. Today however, it was finally meant to be. LL and I were going to meet DeAnn for lunch in the Greenwood area, and I suggested we try Gorditos. DeAnn’s been looking for good Mexican food ever since she moved to Seattle in August and had so far come up with nada.

Parking in the area is a little tight (there are maybe 5 spots outside dedicated to Gorditos, but we found a spot just a few blocks away). While waiting in line we got to preview the more popular orders. Most were various burritos ordered “wet” (with red sauce and melted cheese on top).

burritos larger than your forearmWe also were able to witness the two sizes of burritos. The “regular” is what is pictured here. Split three ways we barely managed to finish it off. The “grande” is about 1.6 times the size (only $1 more!) and can supply most people with 3-4 solid meals. We ordered a “regular wet chicken burrito fajita-style” from the friendly cashier. Fajita-style means that in addition to the black beans, salsa, rice, sour cream, and chicken they add grilled onions and bell peppers.

The chicken is seasoned well and grilled fresh, and you definitely should spring for the “wet” burrito — the sauce is a little spicey and filled with chipotle flavor. Definitely worth a trip to Greenwood.

The atmosphere is fairly standard burrito-joint decor, with loud music playing in the background. You’ll need to speak up or order yours to go. But I’ve been told that the grande burrito will not completely fit into a takeout container 🙂

Gorditos
213 North 85th St.
Seattle, WA 98103
206-706-9352
Wed-Mon 10:30am-9pm (Lunch and Dinner)

Creating a Service on "any free port"

By default, when creating a ServiceHost we require you to specify a base address (e.g. “http://kennyw.com/myService/”). This is because your clients needs to know where to send messages to. Sometimes you have a situation where you don’t need to know the exact address up front (let’s say you are using WS-Discovery or some other registry-based lookup). In that case, you want to indicate to the transport to “use any free port” (or “port 0” in sockets-speak). Fortunately, Indigo has this functionality baked into our addressing parameters.

To signal you want this behavior, set ServiceEndpoint.ListenUriMode to ListenUriMode.Unique (the default is ListenUriMode.Explicit). At build time this will propagate to BindingContext.ListenUriMode, which will then cause the Transport to “unique-ify” the ListenUriBaseAddress.

For exclusive TCP (where the process is directly listening on a socket) we will bind to a uniquely available port#. For shared TCP, Pipes, and HTTP we will append a GUID to the base address which will uniquely identify this endpoint.

NetNamedPipeBinding and Impersonation

On of the top benefits to using NetNamedPipeBinding is that we provide an on-box guarantee for your messages. The on-box guarantee is enforced by Denying the Network Security Identifier (SID: S-1-5-2) access to our named pipe. This is the most secure, safest way of ensuring that you are not exposed to connection attempts from the network.

There is a price to pay for this assurance, and it comes in the form of impersonation support in middle-tier scenarios. The short version is that if you are using impersonation, you can only perform messaging to another Named Pipe endpoint using that impersonated token if you negotiate to NTLM in certain restricted conditions.

Here are the gory details:

Over Kerberos, any client/server authentication will always generate Network SID in the access token. When the server authenticates a client all the relevant information is included in the Kerberos ticket presented by the client, and the ticket doesn’t contain information on the location of the client (this is simply not part of the protocol at this point). So even if both client and server are on the same machine, everything works exactly the same as in the remote case, and the resulting access token has the Network SID (because the protocol has no way of knowing that you are on-box).

Over NTLM, if the client uses the current credentials there is an optimization where NTLM references the existing token under which the client process is running instead of generating a new token. In this case you won’t see the Network SID, because the original token was generated by an interactive logon attempt. If your client is configured with specific credentials, then SSPI will consider this a network logon.

When using WCF, Windows authentication is performed through SSPI-Negotiate, which in most cases will select Kerberos as the actual authentication mechanism. However, if the target SPN passed to SSPI is a well formed SPN for the local computer account (e.g. host/[dns machine name]) then Negotiate will use NTLM (loopback optimization) and the access token will not have the Network SID (and therefore will be usable with NetNamedPipes).

Essential Bakery Café (Seattle, WA)

Rating:

Essential Bakery CafeAfter a long hiatus, I’ve now had three crêpes in the past month. The latest was this afternoon at The Essential Bakery Café. The name is familiar to local shoppers, as Essential’s products are in most supermarket’s fresh bread section. Last year, Essential opened a Café/Chocolatier on Madison and 28th (right across the street from Café Flora). Lauren and I were in the neighborhood, and Gio gave the Café positive reviews, so we stopped in for a snack 🙂

Essential Bakery Café is a warm, welcoming place with lots of windows to take advantage of sunny days like today. In the display case are all sorts of tempting chocolates and pastries. They also serve soups, sandwiches, and crêpes. We had a spinach, mushroom and bechemel crêpe. These are large fork-and-knife crépes, quite different from something at say Crêpes A-Go-Go. The shell was very soft, oozing with bechemel, and it was a flavorful package topped with black pepper and scallions. It was quite tasty, but I recommend sharing one as it’s big and intense.

It was difficult to decide which of the sweets to choose from, but we opted for two chocolates: an Earl Grey Truffle in white chocolate and a Ginger Truffle in dark chocolate. Very unique chocolates, much better than your run-of-the-mill truffle from Dilettante’s for example. The tea and ginger flavors weren’t overpowering, they simply added a little bite and complexity to the delectable chocolates they were mixed with.

Overall Essential Bakery Café was a charming place with quality food and snacks. I’ll be back to try the croissants and the chocolate pastries next!

TIP: Free wireless is available from Open-noon and 3PM-Close daily.

Essential Bakery Café and Chocolatier
2719 East Madison Street
Seattle, WA 98112
206-328-0078

Mon: 6:00AM-6:00PM
Tu-Sat: 6:00AM-8:00PM
Sun: 7:00AM-6:00PM