Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet beskriver de grundläggande steg som krävs för att skapa en routningskonfiguration som använder felhantering. I det här exemplet dirigeras meddelanden till en målslutpunkt. Om ett meddelande inte kan levereras på grund av ett nätverks- eller kommunikationsrelaterat fel (CommunicationException), skickas meddelandet igen till en alternativ slutpunkt.
Kommentar
För att simulera ett nätverksfel innehåller målslutpunkten som används i det här exemplet en felaktig adress. Meddelanden som dirigeras till den här slutpunkten misslyckas eftersom ingen tjänst lyssnar på den angivna adressen.
Kommentar
Även om exemplet i det här avsnittet inte uttryckligen diskuterar tidsgränsinställningar, måste du ta hänsyn till dessa när du använder felhantering. När fel påträffas uppstår ytterligare en fördröjning innan klienten får ett svar. Det beror på att felet tas emot i routningstjänsten, som sedan försöker skicka meddelandet till en slutpunkt för säkerhetskopiering. Om tidsgränsvärdena som är associerade med slutpunkterna för primär- och säkerhetskopieringsmålet är stora kan det uppstå en lång fördröjning för klienten eftersom meddelandet redundansväxlar flera slutpunkter i listan över säkerhetskopieringar innan det skickas.
Eftersom routningstjänsten kan stöta på en maximal fördröjning som motsvarar summan av tidsgränsvärdet för alla slutpunkter som är associerade med ett filter rekommenderar vi att du ökar den förväntade tidsgränsen på klienten i enlighet med detta.
Implementera felhantering
Skapa den grundläggande routningstjänstens konfiguration genom att ange tjänstslutpunkten som exponeras av tjänsten. I följande exempel definieras en enda tjänstslutpunkt som används för att ta emot meddelanden. Den definierar även de klientslutpunkter som används för att skicka meddelanden. deadDestination och realDestination. DeadDestination-slutpunkten innehåller en adress som inte refererar till en tjänst som körs och som används för att simulera ett nätverksfel när meddelanden skickas till den här slutpunkten.
<services> <service behaviorConfiguration="routingConfiguration" name="System.ServiceModel.Routing.RoutingService"> <host> <baseAddresses> <add baseAddress="http://localhost/routingservice/" /> </baseAddresses> </host> <!-- Create the Routing Service endpoint --> <endpoint address="router" binding="basicHttpBinding" name="RoutingServiceEndpoint" contract="System.ServiceModel.Routing.IRequestReplyRouter" /> </service> </services> <!-- Create the destination endpoints that we want to send to --> <client> <!-- Create a dummy endpoint that we know will be down --> <endpoint name="deadDestination" address="net.tcp://localhost:9090/servicemodelsamples/fakeDestination" binding="netTcpBinding" contract="*" /> <!-- Now create the real service endpoint --> <endpoint name="realDestination" address="net.tcp://localhost:8080/servicemodelsamples/service" binding="netTcpBinding" contract="*" /> </client>Definiera de filter som används för att dirigera meddelanden till målslutpunkterna. I det här exemplet används ett MatchAll-filter för att matcha alla meddelanden som tas emot av routningstjänsten.
<filters> <!-- Create a MatchAll filter which will catch all messages --> <filter name="MatchAllFilter1" filterType="MatchAll" /> </filters>Definiera listan över slutpunkter för säkerhetskopiering, som innehåller slutpunkterna som ett meddelande skickas till i händelse av ett nätverks- eller kommunikationsfel när det skickas till den primära målslutpunkten. I följande exempel definieras en säkerhetskopieringslista som innehåller en slutpunkt. Flera slutpunkter kan dock anges i en säkerhetskopieringslista.
Om säkerhetskopieringslistan innehåller flera slutpunkter, när ett nätverks- eller kommunikationsfel inträffar, försöker routningstjänsten skicka meddelandet till den första slutpunkten i listan. Om ett nätverks- eller kommunikationsfel inträffar när den här slutpunkten skickas försöker routningstjänsten skicka meddelandet till nästa slutpunkt i listan. Tjänsten fortsätter att skicka meddelandet till varje slutpunkt i listan över slutpunkter för säkerhetskopiering tills meddelandet har skickats, alla slutpunkter för säkerhetskopiering returnerar ett nätverks- eller kommunikationsrelaterat fel, eller så skickas meddelandet och slutpunkten returnerar ett icke-nätverksrelaterat, icke-kommunikationsrelaterat fel.
<backupLists> <backupList name="backupEndpointList"> <add endpointName="realDestination" /> </backupList> </backupLists>Definiera filtertabellen, som associerar filtret med slutpunkten deadDestination och listan över slutpunkter för säkerhetskopiering. Routningstjänsten försöker först skicka meddelandet till målslutpunkten som är associerad med filtret. Eftersom deadDestination innehåller en adress som inte refererar till en tjänst som körs resulterar detta i ett nätverksfel. Routningstjänsten försöker sedan skicka meddelandet till slutpunkten som anges i backupEndpointList.
<filterTables> <!-- Set up the Routing Service's Message Filter Table --> <filterTable name="filterTable1"> <!-- Add an entity that maps the MatchAllMessageFilter to the dead destination --> <!-- If that endpoint is down, tell the Routing Service to try the endpoints --> <!-- Listed in the backupEndpointList --> <add filterName="MatchAllFilter1" endpointName="deadDestination" backupList="backupEndpointList"/> </filterTable> </filterTables>Om du vill utvärdera inkommande meddelanden mot filtret i filtertabellen måste du associera filtertabellen med tjänstslutpunkterna med hjälp av routningsbeteendet. I följande exempel visas hur du associerar "filterTable1" med tjänstslutpunkterna.
<behaviors> <serviceBehaviors> <!-- Set up the Routing Behavior --> <behavior name="routingConfiguration"> <routing filterTableName="filterTable1" /> </behavior> </serviceBehaviors> </behaviors>
Exempel
Följande är en fullständig lista över konfigurationsfilen:
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright (c) Microsoft Corporation. All Rights Reserved. -->
<configuration>
<system.serviceModel>
<services>
<service behaviorConfiguration="routingConfiguration"
name="System.ServiceModel.Routing.RoutingService">
<host>
<baseAddresses>
<add baseAddress="http://localhost/routingservice/" />
</baseAddresses>
</host>
<!-- Create the Routing Service endpoint -->
<endpoint address="router"
binding="basicHttpBinding"
name="RoutingServiceEndpoint"
contract="System.ServiceModel.Routing.IRequestReplyRouter" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<!-- Set up the Routing Behavior -->
<behavior name="routingConfiguration">
<routing filterTableName="filterTable1" />
</behavior>
</serviceBehaviors>
</behaviors>
<!-- Create the destination endpoints that we want to send to -->
<client>
<!-- Create a dummy endpoint that we know will be down -->
<endpoint name="deadDestination"
address="net.tcp://localhost:9090/servicemodelsamples/fakeDestination"
binding="netTcpBinding"
contract="*" />
<!-- Now create the real service endpoint -->
<endpoint name="realDestination"
address="net.tcp://localhost:8080/servicemodelsamples/service"
binding="netTcpBinding"
contract="*" />
</client>
<routing>
<filters>
<!-- Create a MatchAll filter which will catch all messages -->
<filter name="MatchAllFilter1" filterType="MatchAll" />
</filters>
<filterTables>
<!-- Set up the Routing Service's Message Filter Table -->
<filterTable name="filterTable1">
<!-- Add an entry that maps the MatchAllMessageFilter to the dead destination -->
<!-- If that endpoint is down, tell the Routing Service to try the endpoints -->
<!-- Listed in the backupEndpointList -->
<add filterName="MatchAllFilter1" endpointName="deadDestination" backupList="backupEndpointList"/>
</filterTable>
</filterTables>
<!-- Create the backup endpoint list -->
<backupLists>
<backupList name="backupEndpointList">
<add endpointName="realDestination" />
</backupList>
</backupLists>
</routing>
</system.serviceModel>
</configuration>