Создание маршрутизатора 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. Это позволяет маршрутизатору перенаправлять сообщения, относящиеся к безопасным и надежным сеансам, к соответствующей конечной точке службы.