Создание маршрутизатора WCF - Перенаправление с использованием настраиваемых заголовков

ОГЛАВЛЕНИЕ

Перенаправление с использованием настраиваемых заголовков

Чтобы гарантировать, что каждое сообщение содержит заголовок маршрута, надлежащим образом указывающий службу приложений, с которой клиент пытается связаться, настраиваемый заголовок можно указать в разделе конфигурации конечной точки службы приложений, как показано ниже.

<service behaviorConfiguration="serviceBehavior" 
  name="MessageManager.ServiceA">
  <endpoint address="http://localhost:8010/RouterService"
   binding="wsHttpBinding" bindingConfiguration="wsHttp"
   contract="IServiceA" listenUri="ServiceA">
   <headers>
    <Route
     xmlns="http://www.thatindigogirl.com/samples/2008/01">
     http://www.thatindigogirl.com/samples/2008/01/IServiceA
    </Route>
   </headers>
  </endpoint>
</service> 

Настраиваемые заголовки имеют имя, пространство имен и значение. В некоторых случаях заголовки являются более динамическими, но в данном случае заголовок является фиксированным для представления пространства имен контракта службы. Элемент Route указывает имя заголовка, а пространство имен указывается атрибутом xmlns. Поскольку заголовок указывается как часть конфигурации конечной точки, он входит в метаданные службы. Поэтому, когда клиенты генерируют прокси, они генерируют также конфигурацию клиента, в которую входит заголовок, как показано ниже.

<client>
  <endpoint address="http://localhost:8010/RouterService"
   binding="wsHttpBinding" bindingConfiguration="wsHttp"
   contract="localhost.IServiceA" >
   <headers>
    <Route xmlns="http://www.thatindigogirl.com/samples/2008/01">
     http://www.thatindigogirl.com/samples/2008/01/IServiceA
    </Route>
   </headers>
  </endpoint>
</client> 

Это делает прозрачным присутствие заголовка при кодировке клиента и обеспечивает включение заголовка во все сообщения, включая те, которые используются для установления безопасных и надежных сеансов. По имени заголовка и его пространству имен маршрутизатор может извлечь значение заголовка из любого сообщения следующим образом.

string contractNamespace = 
  requestMessage.Headers.GetHeader<string>(
  "Route",
  "http://www.thatindigogirl.com/samples/2008/01"); 

Единственное отличие этой реализации от предыдущего примера заключается в том, каким образом маршрутизатор обнаруживает пространство имен контракта — из настраиваемого заголовка Route, а не из заголовка Action. Это позволяет маршрутизатору перенаправлять сообщения, относящиеся к безопасным и надежным сеансам, к соответствующей конечной точке службы.