WCF 4.0: маршрутизация (routing)
Продолжим знакомство с нового встроенного сервиса маршрутизации, позволяющего на основе данных, содержащихся в передаваемом сообщении, выполнять переадресацию запроса другому сервису или сервисам. Таблицы и фильтры – позволяют задать правила маршрутизации сообщений, в частности могут применяться следующие фильтры: на основе полного или частичного совпадению URL адреса, на основе содержимого SOAP конверта (header | body) или собственная логика маршрутизации (для этого потребуется разбирать сообщение самостоятельно). Фильтры сопоставляются с конечными точками (endpoint) сервиса (на который должно быть перенаправлено сообщения) на основе специальной таблицы. При этом с одной конечной точкой (endpoint) можно сопоставить несколько фильтров и определить для них различные приоритеты. WCF в соответствие с указанным приоритетом анализирует все фильтры и находит фильтр, правила которого могут быть применены для входящего сообщения . Т.е. приоритеты не определяют пайплайн применения фильтров, а определяют порядок нахождения наиболее подходящего – как только фильтр найден, то сообщение отправляется на WCF сервис, адрес которого соответствует данному фильтру, и дальнейший анализ фильтров прекращается. <client>
<endpoint name="CalculatorService" address="http://…" binding="basicHttpBinding" contract="*" />
</client>
<routing>
<filters>
<filter name="MatchAllFilter" filterType="MatchAll" />
</filters>
<filterTables>
<filterTable name="mainRoutingTable">
<add filterName="MatchAllFilter" endpointName="CalculatorService" />
</filterTable>
</routingTables>
</routing> В примере выше задается фильтр, соответствующий любому сообщение, а в таблице сопоставляется конечная точка (enpoint) с любым фильтром. Резервные endpoint – это конечные точки (endpoint), которые можно указать как резервные для доставки сообщения, т.е. организовать отказоустойчивую маршрутизацию. <routing>
<filterTables>
<filterTable name="filterTable1">
<add filterName="addFilter" endpointName="CalculatorService1"
alternateEndpoints="backupEndpoints"/>
<add filterName="subFilter" endpointName="CalculatorService1"
alternateEndpoints="backupEndpoints"/>
<add filterName="mulFilter" endpointName="CalculatorService1"/>
<add filterName="divFilter" endpointName="CalculatorService1"/>
</filterTable>
</filterTables>
<backupLists>
<backupList name="backupEndpoints">
<add endpointName="CalculatorService2"/>
</backupList>
</backupLists>
</routing>
Широковещательная рассылка (multicast) – перенаправление сообщений на несколько конечных точек (endpoint) или WCF сервисов. При использовании широковещательной рассылки следует учесть следующие ограничения: поддерживаются только one-way и duplex схемы, а схема request-response не поддерживается. <service>
<endpoint address="" binding="wsHttpBinding" name="" contract="System.ServiceModel.Routing.ISimplexDatagramRouter" />
</service>
<routing>
<filters>
<filter name="wildcardFilter" filterType="MatchAll" />
</filters>
<filterTables>
<filterTable name="filterTable1">
<add filterName="wildcardFilter" endpointName="Target1"/>
<add filterName="wildcardFilter" endpointName="Target2"/>
<add filterName="wildcardFilter" endpointName="Target3"/>
</filterTable>
</filterTables>
</routing>
Смена протокола (protocol bridging) – обеспечивает возможность смены привязки(binding)/протокола между начальной точкой (клиент) и конечной точкой (WCF сервис). Например, взаимодействие между WCF клиентом и WCF сервисом маршрутизации происходит по HTTP (wshttpbinding), а далее между WCF сервисом маршрутизации и конечным WCF сервисом по TCP (nettcpbinding). <services>
<service behaviorConfiguration="routingConfiguration"
name="System.ServiceModel.Routing.RoutingService">
<endpoint address="router"
binding="basicHttpBinding"
name="RoutingServiceEndpoint"
contract="System.ServiceModel.Routing.IRequestReplyRouter" />
</service>
</services>
<client>
<endpoint name="realDestination"
address="net.tcp://localhost:8080/servicemodelsamples/service"
binding="netTcpBinding"
contract="*" />
</client> В примере WCF сервис маршрутизации опубликован по протоколу HTTP (basichtppbinding), тогда как конечный WCF сервис, определенный в теге <client>, использует TPC (nettcpbinding). Веб-каст с примерами по обсуждаемым возможностям можно найти на портале TechDays.ru – "WCF 4.0 в примерах. Часть 1.".
Recent Comments