Inleiding tot routering
De Routeringsservice biedt een algemene SOAP-intermediair die geschikt is voor het routeren van berichten op basis van berichtinhoud. Met de routeringsservice kunt u complexe routeringslogica maken waarmee u scenario's zoals serviceaggregatie, serviceversiebeheer, prioriteitsroutering en multicastroutering kunt implementeren. De routeringsservice biedt ook foutafhandeling waarmee u lijsten met back-upeindpunten kunt instellen, waarnaar berichten worden verzonden als er een fout optreedt bij het verzenden naar het primaire doeleindpunt.
Dit onderwerp is bedoeld voor nieuwe gebruikers van de routeringsservice en behandelt basisconfiguratie en hosting van de routeringsservice.
Configuratie
De routeringsservice wordt geïmplementeerd als een WCF-service waarmee een of meer service-eindpunten worden weergegeven die berichten ontvangen van clienttoepassingen en de berichten routeren naar een of meer doeleindpunten. De service biedt een RoutingBehavior, die wordt toegepast op de service-eindpunten die door de service worden weergegeven. Dit gedrag wordt gebruikt om verschillende aspecten van de werking van de service te configureren. Voor een eenvoudige configuratie wanneer u een configuratiebestand gebruikt, worden de parameters opgegeven op de RoutingBehavior. In op code gebaseerde scenario's worden deze parameters opgegeven als onderdeel van een RoutingConfiguration object, dat vervolgens kan worden doorgegeven aan een RoutingBehavior.
Wanneer u begint, voegt dit gedrag de SoapProcessingBehavior, die wordt gebruikt om SOAP-verwerking van berichten uit te voeren, toe aan de clienteindpunten. Hierdoor kan de routeringsservice berichten verzenden naar eindpunten waarvoor een andere MessageVersion is vereist dan het eindpunt waarop het bericht is ontvangen. De RoutingBehavior registreert ook een service-extensie, de RoutingExtension, die een toegankelijkheidspunt biedt voor het wijzigen van de configuratie van de routeringsservice tijdens runtime.
De klasse RoutingConfiguration biedt een consistente wijze om de configuratie van de routeringsservice te configureren en bij te werken. Het bevat parameters die fungeren als de instellingen voor de routeringsservice en worden gebruikt om de RoutingBehavior te configureren wanneer de service wordt gestart of wordt doorgegeven aan de RoutingExtension om de routeringsconfiguratie tijdens runtime te wijzigen.
De routeringslogica die wordt gebruikt om op inhoud gebaseerde routering van berichten uit te voeren, wordt gedefinieerd door meerdere MessageFilter objecten samen te groeperen in filtertabellen (MessageFilterTable<TFilterData> objecten). Binnenkomende berichten worden geëvalueerd op basis van de berichtfilters in de filtertabel en voor elk MessageFilter dat overeenkomt met het bericht, doorgestuurd naar een doeleindpunt. De filtertabel die moet worden gebruikt om berichten te routeren, wordt opgegeven met behulp van de RoutingBehavior in de configuratie of via code met behulp van het RoutingConfiguration-object .
Eindpunten definiëren
Hoewel het lijkt alsof u de configuratie moet starten door de routeringslogica te definiëren die u gaat gebruiken, moet uw eerste stap eigenlijk zijn om de vorm van de eindpunten te bepalen waarnaar u berichten wilt routeren. De routeringsservice maakt gebruik van contracten die de vorm definiëren van de kanalen die worden gebruikt voor het ontvangen en verzenden van berichten, en daarom moet de vorm van het invoerkanaal overeenkomen met die van het uitvoerkanaal. Als u bijvoorbeeld doorsturen naar eindpunten die gebruikmaken van de shape voor het antwoordkanaal voor aanvragen, moet u een compatibel contract gebruiken op de binnenkomende eindpunten, zoals de IRequestReplyRouter.
Dit betekent dat als uw doeleindpunten contracten gebruiken met meerdere communicatiepatronen (zoals het combineren van eenrichtings- en tweerichtingsbewerkingen), u geen enkel service-eindpunt kunt maken dat berichten naar alle eindpunten kan ontvangen en routeren. U moet bepalen welke eindpunten compatibele shapes hebben en een of meer service-eindpunten definiëren die worden gebruikt om berichten te ontvangen die naar de doeleindpunten moeten worden gerouteerd.
Notitie
Wanneer u werkt met contracten die meerdere communicatiepatronen opgeven (zoals een combinatie van eenrichtings- en tweerichtingsbewerkingen,) is een tijdelijke oplossing het gebruik van een dubbelzijdig contract bij de routeringsservice, zoals IDuplexSessionRouter. Dit betekent echter dat de binding geschikt moet zijn voor dubbelzijdige communicatie, wat mogelijk niet mogelijk is voor alle scenario's. In scenario's waarin dit niet mogelijk is, kan het nodig zijn om de communicatie in meerdere eindpunten te factoreren of de toepassing te wijzigen.
Zie Routeringscontracten voor meer informatie over routeringscontracten.
Nadat het service-eindpunt is gedefinieerd, kunt u RoutingBehavior gebruiken om een specifieke RoutingConfiguration te koppelen aan het eindpunt. Wanneer u de routeringsservice configureert met behulp van een configuratiebestand, wordt de RoutingBehavior gebruikt om de filtertabel op te geven die de routeringslogica bevat die wordt gebruikt voor het verwerken van berichten die op dit eindpunt zijn ontvangen. Als u de routeringsservice programmatisch configureert, kunt u de filtertabel opgeven met behulp van RoutingConfiguration.
In het volgende voorbeeld worden de service- en clienteindpunten gedefinieerd die zowel programmatisch als met behulp van een configuratiebestand door de routeringsservice worden gebruikt.
<services>
<!--ROUTING SERVICE -->
<service behaviorConfiguration="routingData"
name="System.ServiceModel.Routing.RoutingService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/routingservice/router"/>
</baseAddresses>
</host>
<!-- Define the service endpoints that are receive messages -->
<endpoint address=""
binding="wsHttpBinding"
name="reqReplyEndpoint"
contract="System.ServiceModel.Routing.IRequestReplyRouter" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="routingData">
<serviceMetadata httpGetEnabled="True"/>
<!-- Add the RoutingBehavior and specify the Routing Table to use -->
<routing filterTableName="routingTable1" />
</behavior>
</serviceBehaviors>
</behaviors>
<client>
<!-- Define the client endpoint(s) to route messages to -->
<endpoint name="CalculatorService"
address="http://localhost:8000/servicemodelsamples/service"
binding="wsHttpBinding" contract="*" />
</client>
//set up some communication defaults
string clientAddress = "http://localhost:8000/servicemodelsamples/service";
string routerAddress = "http://localhost:8000/routingservice/router";
Binding routerBinding = new WSHttpBinding();
Binding clientBinding = new WSHttpBinding();
//add the endpoint the router uses to receive messages
serviceHost.AddServiceEndpoint(
typeof(IRequestReplyRouter),
routerBinding,
routerAddress);
//create the client endpoint the router routes messages to
ContractDescription contract = ContractDescription.GetContract(
typeof(IRequestReplyRouter));
ServiceEndpoint client = new ServiceEndpoint(
contract,
clientBinding,
new EndpointAddress(clientAddress));
//create a new routing configuration object
RoutingConfiguration rc = new RoutingConfiguration();
….
rc.FilterTable.Add(new MatchAllMessageFilter(), endpointList);
//attach the behavior to the service host
serviceHost.Description.Behaviors.Add(
new RoutingBehavior(rc));
In dit voorbeeld configureert u de routeringsservice om één eindpunt beschikbaar te maken met een adres van http://localhost:8000/routingservice/router
, dat wordt gebruikt om berichten te ontvangen die moeten worden gerouteerd. Omdat de berichten worden gerouteerd naar eindpunten voor het aanvragen en beantwoorden, gebruikt het service-eindpunt het IRequestReplyRouter contract. Deze configuratie definieert ook één clienteindpunt van http://localhost:8000/servicemodelsample/service
die berichten worden doorgestuurd. De filtertabel (niet weergegeven) met de naam 'routingTable1' bevat de routeringslogica die wordt gebruikt om berichten te routeren en is gekoppeld aan het service-eindpunt met behulp van routingBehavior (voor een configuratiebestand) of RoutingConfiguration (voor programmatische configuratie).
Routeringslogica
Als u de routeringslogica wilt definiëren die wordt gebruikt om berichten te routeren, moet u bepalen op welke gegevens in de binnenkomende berichten uniek kunnen worden gereageerd. Als bijvoorbeeld alle doeleindpunten die u doorsturen om dezelfde SOAP-acties te delen, de waarde van de actie in het bericht geen goede indicator is van welk specifiek eindpunt het bericht moet worden doorgestuurd. Als u berichten op unieke wijze naar één specifiek eindpunt moet routeren, moet u filteren op gegevens waarmee het doeleindpunt wordt geïdentificeerd waarnaar het bericht wordt gerouteerd.
De routeringsservice biedt verschillende MessageFilter-implementaties waarmee specifieke waarden in het bericht worden geïnspecteerd, zoals het adres, de actie, de eindpuntnaam of zelfs een XPath-query. Als geen van deze implementaties aan uw behoeften voldoet, kunt u een aangepaste MessageFilter-implementatie maken. Zie Berichtfilters en Een filter kiezen voor meer informatie over berichtfilters en een vergelijking van de implementaties die door de routeringsservice worden gebruikt.
Meerdere berichtfilters worden samen ingedeeld in filtertabellen, die elk MessageFilter koppelen aan een doeleindpunt. Desgewenst kan de filtertabel ook worden gebruikt om een lijst met back-upeindpunten op te geven waarnaar de Routeringsservice het bericht probeert te verzenden in het geval van een overdrachtsfout.
Standaard worden alle berichtfilters in een filtertabel tegelijkertijd geëvalueerd; U kunt echter opgeven Priority dat de berichtfilters in een specifieke volgorde worden geëvalueerd. Alle vermeldingen met de hoogste prioriteit worden eerst geëvalueerd en berichtfilters van lagere prioriteiten worden niet geëvalueerd als een overeenkomst op een hoger prioriteitsniveau wordt gevonden. Zie Berichtfilters voor meer informatie over filtertabellen.
In de volgende voorbeelden worden de MatchAllMessageFilter, die voor alle berichten wordt geëvalueerd true
, gebruikt. Dit MessageFilter wordt toegevoegd aan de filtertabel routingTable1, waarmee het MessageFilter wordt gekoppeld aan het clienteindpunt met de naam CalculatorService. De RoutingBehavior geeft vervolgens aan dat deze tabel moet worden gebruikt voor het routeren van berichten die door het service-eindpunt zijn verwerkt.
<behaviors>
<serviceBehaviors>
<behavior name="routingData">
<serviceMetadata httpGetEnabled="True"/>
<!-- Add the RoutingBehavior and specify the Routing Table to use -->
<routing filterTableName="routingTable1" />
</behavior>
</serviceBehaviors>
</behaviors>
<!--ROUTING SECTION -->
<routing>
<filters>
<filter name="MatchAllFilter1" filterType="MatchAll" />
</filters>
<filterTables>
<table name="routingTable1">
<filters>
<add filterName="MatchAllFilter1" endpointName="CalculatorService" />
</filters>
</table>
</filterTables>
</routing>
//create a new routing configuration object
RoutingConfiguration rc = new RoutingConfiguration();
//create the endpoint list that contains the endpoints to route to
//in this case we have only one
List<ServiceEndpoint> endpointList = new List<ServiceEndpoint>();
endpointList.Add(client);
//add a MatchAll filter to the Router's filter table
//map it to the endpoint list defined earlier
//when a message matches this filter, it is sent to the endpoint contained in the list
rc.FilterTable.Add(new MatchAllMessageFilter(), endpointList);
Notitie
Standaard evalueert de routeringsservice alleen de kopteksten van het bericht. Als u wilt toestaan dat de filters toegang hebben tot de hoofdtekst van het bericht, moet u instellen op RouteOnHeadersOnlyfalse
.
Multicast
Hoewel veel routeringsserviceconfiguraties gebruikmaken van exclusieve filterlogica waarmee berichten worden gerouteerd naar slechts één specifiek eindpunt, moet u mogelijk een bepaald bericht routeren naar meerdere doeleindpunten. Als u een bericht wilt multicasten naar meerdere bestemmingen, moet aan de volgende voorwaarden worden voldaan:
De kanaalshape mag geen aanvraag-antwoord zijn (hoewel dit in één richting of dubbelzijdig kan zijn), omdat er slechts één antwoord kan worden ontvangen door de clienttoepassing als reactie op de aanvraag.
Er moeten meerdere filters worden geretourneerd
true
bij het evalueren van het bericht.
Als aan deze voorwaarden wordt voldaan, wordt het bericht doorgestuurd naar alle eindpunten van alle filters die worden true
geëvalueerd. In het volgende voorbeeld wordt een routeringsconfiguratie gedefinieerd die ertoe leidt dat berichten naar beide eindpunten worden gerouteerd als het eindpuntadres in het bericht is http://localhost:8000/routingservice/router/rounding
.
<!--ROUTING SECTION -->
<routing>
<filters>
<filter name="MatchAllFilter1" filterType="MatchAll" />
<filter name="RoundingFilter1" filterType="EndpointAddress"
filterData="http://localhost:8000/routingservice/router/rounding" />
</filters>
<filterTables>
<table name="routingTable1">
<filters>
<add filterName="MatchAllFilter1" endpointName="CalculatorService" />
<add filterName="RoundingFilter1" endpointName="RoundingCalcService" />
</filters>
</table>
</filterTables>
</routing>
rc.FilterTable.Add(new MatchAllMessageFilter(), calculatorEndpointList);
rc.FilterTable.Add(new EndpointAddressMessageFilter(new EndpointAddress(
"http://localhost:8000/routingservice/router/rounding")),
roundingCalcEndpointList);
SOAP-verwerking
Ter ondersteuning van de routering van berichten tussen verschillende protocollen, voegt routingBehavior standaard toe SoapProcessingBehavior aan alle clienteindpunten waarnaar berichten worden gerouteerd. Dit gedrag maakt automatisch een nieuwe MessageVersion voordat het bericht naar het eindpunt wordt gerouteerd en er wordt een compatibele MessageVersion gemaakt voor elk antwoorddocument voordat het wordt geretourneerd naar de aanvragende clienttoepassing.
De stappen voor het maken van een nieuwe MessageVersion voor het uitgaande bericht zijn als volgt:
Verwerking van aanvragen
Haal de MessageVersion van de uitgaande binding/het kanaal op.
Haal de hoofdtekstlezer voor het oorspronkelijke bericht op.
Maak een nieuw bericht met dezelfde actie, hoofdtekstlezer en een nieuwe MessageVersion.
Als Addressing != Adressering.None kopieert u de headers Aan, Van, FaultTo en RelateTo naar het nieuwe bericht.
Kopieer alle berichteigenschappen naar het nieuwe bericht.
Sla het oorspronkelijke aanvraagbericht op dat moet worden gebruikt bij het verwerken van het antwoord.
Retourneer het nieuwe aanvraagbericht.
Antwoordverwerking
Haal de MessageVersion van het oorspronkelijke aanvraagbericht op.
Haal de hoofdtekstlezer op voor het ontvangen antwoordbericht.
Maak een nieuw antwoordbericht met dezelfde actie, hoofdtekstlezer en de MessageVersion van het oorspronkelijke aanvraagbericht.
Als Addressing != Adressering.None kopieert u de headers Aan, Van, FaultTo en RelateTo naar het nieuwe bericht.
Kopieer de berichteigenschappen naar het nieuwe bericht.
Retourneer het nieuwe antwoordbericht.
SoapProcessingBehavior wordt standaard automatisch toegevoegd aan de clienteindpunten wanneer RoutingBehavior de service wordt gestart. U kunt echter bepalen of SOAP-verwerking wordt toegevoegd aan alle clienteindpunten met behulp van de SoapProcessingEnabled eigenschap. U kunt het gedrag ook rechtstreeks toevoegen aan een specifiek eindpunt en dit gedrag in- of uitschakelen op eindpuntniveau als een gedetailleerdere controle van SOAP-verwerking vereist is.
Notitie
Als SOAP-verwerking is uitgeschakeld voor een eindpunt waarvoor een andere MessageVersion is vereist dan die van het oorspronkelijke aanvraagbericht, moet u een aangepast mechanisme opgeven voor het uitvoeren van SOAP-wijzigingen die vereist zijn voordat het bericht naar het doeleindpunt wordt verzonden.
In de volgende voorbeelden wordt de eigenschap soapProcessingEnabled gebruikt om te voorkomen dat soapProcessingBehaviorautomatisch wordt toegevoegd aan alle clienteindpunten.
<behaviors>
<!--default routing service behavior definition-->
<serviceBehaviors>
<behavior name="routingConfiguration">
<routing filterTableName="filterTable1" soapProcessingEnabled="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
//create the default RoutingConfiguration
RoutingConfiguration rc = new RoutingConfiguration();
rc.SoapProcessingEnabled = false;
Dynamische configuratie
Wanneer u extra clienteindpunten toevoegt of de filters moet wijzigen die worden gebruikt om berichten te routeren, moet u de configuratie dynamisch bijwerken om te voorkomen dat de service wordt onderbroken naar de eindpunten die momenteel berichten ontvangen via de routeringsservice. Het wijzigen van een configuratiebestand of de code van de hosttoepassing is niet altijd voldoende, omdat voor beide methoden de toepassing moet worden gerecycled. Dit kan leiden tot het potentiële verlies van berichten die momenteel worden verzonden en de kans op downtime terwijl de service opnieuw wordt gestart.
U kunt de RoutingConfiguration alleen programmatisch wijzigen. Hoewel u de service in eerste instantie kunt configureren met behulp van een configuratiebestand, kunt u de configuratie alleen tijdens runtime wijzigen door een nieuwe RoutingConfiguration samen te stellen en deze als parameter door te geven aan de ApplyConfiguration methode die wordt weergegeven door de RoutingExtension service-extensie. Berichten die momenteel onderweg zijn, blijven gerouteerd met behulp van de vorige configuratie, terwijl berichten die worden ontvangen na de aanroep van ApplyConfiguration , gebruikmaken van de nieuwe configuratie. In het volgende voorbeeld ziet u hoe u een exemplaar van de routeringsservice maakt en vervolgens de configuratie wijzigt.
RoutingConfiguration routingConfig = new RoutingConfiguration();
routingConfig.RouteOnHeadersOnly = true;
routingConfig.FilterTable.Add(new MatchAllMessageFilter(), endpointList);
RoutingBehavior routing = new RoutingBehavior(routingConfig);
routerHost.Description.Behaviors.Add(routing);
routerHost.Open();
// Construct a new RoutingConfiguration
RoutingConfiguration rc2 = new RoutingConfiguration();
ServiceEndpoint clientEndpoint = new ServiceEndpoint();
ServiceEndpoint clientEndpoint2 = new ServiceEndpoint();
// Add filters to the FilterTable in the new configuration
rc2.FilterTable.add(new MatchAllMessageFilter(),
new List<ServiceEndpoint>() { clientEndpoint });
rc2.FilterTable.add(new MatchAllMessageFilter(),
new List<ServiceEndpoint>() { clientEndpoint2 });
rc2.RouteOnHeadersOnly = false;
// Apply the new configuration to the Routing Service hosted in
routerHost.routerHost.Extensions.Find<RoutingExtension>().ApplyConfiguration(rc2);
Notitie
Wanneer u de routeringsservice op deze manier bijwerkt, is het alleen mogelijk om een nieuwe configuratie door te geven. Het is niet mogelijk om alleen bepaalde elementen van de huidige configuratie te wijzigen of nieuwe vermeldingen toe te voegen aan de huidige configuratie; u moet een nieuwe configuratie maken en doorgeven die de bestaande configuratie vervangt.
Notitie
Alle sessies die zijn geopend met behulp van de vorige configuratie, blijven de vorige configuratie gebruiken. De nieuwe configuratie wordt alleen gebruikt door nieuwe sessies.
Foutafhandeling
Als er CommunicationException een probleem is opgetreden tijdens het verzenden van een bericht, vindt foutafhandeling plaats. Deze uitzonderingen geven meestal aan dat er een probleem is opgetreden tijdens het communiceren met het gedefinieerde clienteindpunt, zoals een EndpointNotFoundException, ServerTooBusyExceptionof CommunicationObjectFaultedException. De foutafhandelingscode onderscheppen en proberen opnieuw te verzenden wanneer er een TimeoutException optreedt. Dit is een andere veelvoorkomende uitzondering die niet is afgeleid van CommunicationException.
Wanneer een van de voorgaande uitzonderingen optreedt, voert de routeringsservice een failover uit naar een lijst met back-upeindpunten. Als alle back-upeindpunten mislukken met een communicatiefout of als een eindpunt een uitzondering retourneert die aangeeft dat er een fout in de doelservice is opgetreden, retourneert de routeringsservice een fout naar de clienttoepassing.
Notitie
Met de functionaliteit voor foutafhandeling worden uitzonderingen vastgelegd en verwerkt die optreden bij het verzenden van een bericht en bij het sluiten van een kanaal. De code voor foutafhandeling is niet bedoeld voor het detecteren of verwerken van uitzonderingen die zijn gemaakt door de toepassingseindpunten waarmee deze communiceert; een FaultException gegenereerd door een service wordt weergegeven in de Routeringsservice als een FaultMessage en wordt teruggeleid naar de client.
Als er een fout optreedt wanneer de routeringsservice probeert een bericht door te sturen, krijgt u mogelijk een FaultException bericht aan de clientzijde in plaats van een EndpointNotFoundException bericht dat normaal gesproken niet aanwezig is in de routeringsservice. Een routeringsservice kan dus uitzonderingen maskeren en geen volledige transparantie bieden, tenzij u geneste uitzonderingen bekijkt.
Uitzonderingen traceren
Wanneer het verzenden van een bericht naar een eindpunt in een lijst mislukt, traceert de routeringsservice de resulterende uitzonderingsgegevens en koppelt de uitzonderingsgegevens als een berichteigenschap met de naam Uitzonderingen. Hierdoor blijven de uitzonderingsgegevens behouden en kan een gebruiker programmatische toegang krijgen via een berichtencontrole. De uitzonderingsgegevens worden per bericht opgeslagen in een woordenlijst waarmee de eindpuntnaam wordt toegewezen aan de details van de uitzondering die zijn opgetreden bij het verzenden van een bericht.
Back-upeindpunten
Elke filtervermelding in de filtertabel kan desgewenst een lijst met back-upeindpunten opgeven, die worden gebruikt in het geval van een overdrachtsfout bij het verzenden naar het primaire eindpunt. Als een dergelijke fout optreedt, probeert de routeringsservice het bericht te verzenden naar de eerste vermelding in de lijst met back-upeindpunten. Als deze verzendpoging ook een overdrachtsfout tegenkomt, wordt het volgende eindpunt in de back-uplijst geprobeerd. De routeringsservice blijft het bericht verzenden naar elk eindpunt in de lijst totdat het bericht is ontvangen, alle eindpunten retourneren een overdrachtsfout of een niet-overdrachtsfout wordt geretourneerd door een eindpunt.
In de volgende voorbeelden wordt de routeringsservice geconfigureerd voor het gebruik van een back-uplijst.
<routing>
<filters>
<!-- Create a MatchAll filter that catches 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>
<!-- Add an endpoint list that contains the backup destinations -->
<backupList name="backupEndpointList">
<add endpointName="realDestination" />
<add endpointName="backupDestination" />
</backupList>
</backupLists>
</routing>
//create the endpoint list that contains the service endpoints we want to route to
List<ServiceEndpoint> backupList = new List<ServiceEndpoint>();
//add the endpoints in the order that the Routing Service should contact them
//first add the endpoint that we know is down
//clearly, normally you wouldn't know that this endpoint was down by default
backupList.Add(fakeDestination);
//then add the real Destination endpoint
//the Routing Service attempts to send to this endpoint only if it
//encounters a TimeOutException or CommunicationException when sending
//to the previous endpoint in the list.
backupList.Add(realDestination);
//add the backupDestination endpoint
//the Routing Service attempts to send to this endpoint only if it
//encounters a TimeOutException or CommunicationsException when sending
//to the previous endpoints in the list
backupList.Add(backupDestination);
//create the default RoutingConfiguration option
RoutingConfiguration rc = new RoutingConfiguration();
//add a MatchAll filter to the Routing Configuration's filter table
//map it to the list of endpoints defined above
//when a message matches this filter, it is sent to the endpoints in the list in order
//if an endpoint is down or does not respond (which the first endpoint won't
//since the client does not exist), the Routing Service automatically moves the message
//to the next endpoint in the list and try again.
rc.FilterTable.Add(new MatchAllMessageFilter(), backupList);
Ondersteunde foutpatronen
In de volgende tabel worden de patronen beschreven die compatibel zijn met het gebruik van back-upeindpuntenlijsten, samen met notities over de details van foutafhandeling voor specifieke patronen.
Patroon | Sessie | Transactie | Context ontvangen | Ondersteunde back-uplijst | Opmerkingen |
---|---|---|---|---|---|
One-way | Ja | Probeert het bericht opnieuw te verzenden op een back-upeindpunt. Als dit bericht multicast is, wordt alleen het bericht op het mislukte kanaal verplaatst naar de back-upbestemming. | |||
One-way | ✔️ | Nee | Er wordt een uitzondering gegenereerd en de transactie wordt teruggedraaid. | ||
One-way | ✔️ | Ja | Probeert het bericht opnieuw te verzenden op een back-upeindpunt. Nadat het bericht is ontvangen, voltooit u alle ontvangen contexten. Als het bericht niet is ontvangen door een eindpunt, voltooit u de ontvangstcontext niet. Wanneer dit bericht multicast wordt uitgevoerd, wordt de ontvangstcontext alleen voltooid als het bericht is ontvangen door ten minste één eindpunt (primaire of back-up). Als geen van de eindpunten in een van de multicast-paden het bericht heeft ontvangen, voltooit u de ontvangstcontext niet. |
||
One-way | ✔️ | ✔️ | Ja | De vorige transactie afbreken, een nieuwe transactie maken en alle berichten opnieuw verzenden. Berichten die een fout hebben aangetroffen, worden verzonden naar een back-upbestemming. Nadat een transactie is gemaakt waarin alle verzendingen zijn geslaagd, voltooit u de ontvangstcontexten en voert u de transactie door. |
|
One-way | ✔️ | Ja | Probeert het bericht opnieuw te verzenden op een back-upeindpunt. In een multicast-scenario worden alleen de berichten in een sessie met een fout of in een sessie waarvan de sessie is gesloten, opnieuw verzonden naar back-upbestemmingen. | ||
One-way | ✔️ | ✔️ | Nee | Er wordt een uitzondering gegenereerd en de transactie wordt teruggedraaid. | |
One-way | ✔️ | ✔️ | Ja | Probeert het bericht opnieuw te verzenden op een back-upeindpunt. Nadat alle berichten zonder fouten zijn verzonden, geeft de sessie aan dat er geen berichten meer zijn en dat de routeringsservice alle uitgaande sessiekanaal(en) sluit, alle ontvangen contexten zijn voltooid en het binnenkomende sessiekanaal wordt gesloten. | |
One-way | ✔️ | ✔️ | ✔️ | Ja | De huidige transactie afbreken en een nieuwe transactie maken. Alle vorige berichten in de sessie opnieuw verzenden. Nadat een transactie is gemaakt waarin alle berichten zijn verzonden en de sessie aangeeft dat er geen berichten meer zijn, worden alle uitgaande sessiekanalen gesloten, worden alle contexten ontvangen voltooid met de transactie, wordt het binnenkomende sessiekanaal gesloten en wordt de transactie doorgevoerd. Wanneer de sessies multicast worden uitgevoerd, worden de berichten die geen fout hebben, opnieuw verzonden naar dezelfde bestemming als voorheen en worden berichten die een fout hebben aangetroffen, verzonden naar back-upbestemmingen. |
Twee richtingen | Ja | Verzenden naar een back-upbestemming. Nadat een kanaal een antwoordbericht retourneert, retourneert u het antwoord op de oorspronkelijke client. | |||
Twee richtingen | ✔️ | Ja | Alle berichten op het kanaal verzenden naar een back-upbestemming. Nadat een kanaal een antwoordbericht retourneert, retourneert u het antwoord op de oorspronkelijke client. | ||
Twee richtingen | ✔️ | Nee | Er wordt een uitzondering gegenereerd en de transactie wordt teruggedraaid. | ||
Twee richtingen | ✔️ | ✔️ | Nee | Er wordt een uitzondering gegenereerd en de transactie wordt teruggedraaid. | |
Duplex | Nee | Dubbelzijdige communicatie zonder sessie wordt momenteel niet ondersteund. | |||
Duplex | ✔️ | Ja | Verzenden naar een back-upbestemming. |
Hosting
Omdat de routeringsservice is geïmplementeerd als een WCF-service, moet deze zelf worden gehost binnen een toepassing of worden gehost door IIS of WAS. Het wordt aanbevolen om de routeringsservice te hosten in IIS, WAS of een Windows-servicetoepassing om te profiteren van de functies voor automatisch starten en levenscyclusbeheer die beschikbaar zijn in deze hostingomgevingen.
In het volgende voorbeeld ziet u hoe u de routeringsservice in een toepassing host.
using (ServiceHost serviceHost =
new ServiceHost(typeof(RoutingService)))
Als u de routeringsservice binnen IIS of WAS wilt hosten, moet u een servicebestand (.svc) maken of gebruikmaken van op configuratie gebaseerde activering van de service. Wanneer u een servicebestand gebruikt, moet u de RoutingService parameter Service opgeven. Het volgende voorbeeld bevat een voorbeeldservicebestand dat kan worden gebruikt voor het hosten van de routeringsservice met IIS of WAS.
<%@ ServiceHost Language="C#" Debug="true" Service="System.ServiceModel.Routing.RoutingService,
System.ServiceModel.Routing, version=4.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" %>
Routeringsservice en imitatie
De WCF-routeringsservice kan worden gebruikt met imitatie voor zowel het verzenden als ontvangen van berichten. Alle gebruikelijke Windows-beperkingen van imitatie zijn van toepassing. Als u service- of accountmachtigingen moet instellen om imitatie te gebruiken bij het schrijven van uw eigen service, moet u dezelfde stappen uitvoeren om imitatie met de routeringsservice te gebruiken. Zie Delegatie en imitatie voor meer informatie.
Imitatie met de routeringsservice vereist het gebruik van ASP.NET imitatie in ASP.NET compatibiliteitsmodus of het gebruik van Windows-referenties die zijn geconfigureerd om imitatie toe te staan. Zie WCF Services en ASP.NET voor meer informatie over ASP.NET compatibiliteitsmodus.
Waarschuwing
De WCF-routeringsservice biedt geen ondersteuning voor imitatie met basisverificatie.
Als u ASP.NET imitatie met de routeringsservice wilt gebruiken, schakelt u ASP.NET compatibiliteitsmodus in voor de servicehostingomgeving. De routeringsservice is al gemarkeerd als toestaan ASP.NET compatibiliteitsmodus en imitatie wordt automatisch ingeschakeld. Imitatie is het enige ondersteunde gebruik van ASP.NET integratie met de routeringsservice.
Als u Windows-referentie-imitatie wilt gebruiken met de routeringsservice, moet u zowel de referenties als de service configureren. Het clientreferentieobject (WindowsClientCredentialtoegankelijk vanuit de ChannelFactory) definieert een AllowedImpersonationLevel eigenschap die moet worden ingesteld om imitatie toe te staan. Ten slotte moet u op de service het ServiceAuthorizationBehavior gedrag configureren dat moet worden ingesteld ImpersonateCallerForAllOperations
op true
. De routeringsservice gebruikt deze vlag om te bepalen of de clients moeten worden gemaakt voor het doorsturen van berichten waarvoor imitatie is ingeschakeld.