Směrování – úvod
Služba směrování poskytuje obecný zprostředkující protokol SOAP, který je schopen směrovat zprávy na základě obsahu zprávy. Pomocí směrovací služby můžete vytvořit složitou logiku směrování, která umožňuje implementovat scénáře, jako je agregace služeb, správa verzí služeb, směrování priority a směrování vícesměrového vysílání. Služba směrování také poskytuje zpracování chyb, které umožňuje nastavit seznamy koncových bodů zálohování, do kterých se zprávy odesílají v případě selhání při odesílání do primárního cílového koncového bodu.
Toto téma je určeno pro ty, kteří s touto službou začíná, a zabývá se základní konfigurací a hostováním služby Směrování.
Konfigurace
Služba směrování je implementována jako služba WCF, která zveřejňuje jeden nebo více koncových bodů služby, které přijímají zprávy z klientských aplikací a směrují zprávy do jednoho nebo více cílových koncových bodů. Služba poskytuje RoutingBehaviorslužbu , která se použije na koncové body služby vystavené službou. Toto chování se používá ke konfiguraci různých aspektů fungování služby. Pro usnadnění konfigurace při použití konfiguračního souboru jsou parametry zadány v RoutingBehavior. Ve scénářích založených na kódu by se tyto parametry zadaly jako součást RoutingConfiguration objektu, které je pak možné předat routingBehavior.
Při spuštění toto chování přidá SoapProcessingBehaviordo koncových bodů klienta , který se používá k provádění zpracování zpráv SOAP. To umožňuje směrovací službě přenášet zprávy do koncových bodů, které vyžadují jinou verzi zprávy než koncový bod, který zpráva přijala. RoutingBehavior také zaregistruje rozšíření služby, RoutingExtensioncož poskytuje bod přístupnosti pro úpravu konfigurace směrovací služby za běhu.
Třída RoutingConfiguration poskytuje konzistentní způsob konfigurace a aktualizace konfigurace služby Směrování. Obsahuje parametry, které fungují jako nastavení služby směrování a slouží ke konfiguraci RoutingBehavior při spuštění služby nebo je předána službě RoutingExtension pro úpravu konfigurace směrování za běhu.
Logika směrování používaná k provádění směrování zpráv na základě obsahu je definována seskupením více MessageFilter objektů do tabulek filtru (MessageFilterTable<TFilterData> objektů). Příchozí zprávy se vyhodnocují proti filtrům zpráv obsaženým v tabulce filtru a pro každý messageFilter , který odpovídá zprávě, přeposlaný do cílového koncového bodu. Tabulka filtrů, která by měla být použita ke směrování zpráv, je určena pomocí RoutingBehavior v konfiguraci nebo prostřednictvím kódu pomocí RoutingConfiguration objektu.
Definování koncových bodů
I když se může zdát, že byste měli zahájit konfiguraci definováním logiky směrování, kterou budete používat, měl by váš první krok ve skutečnosti být určení tvaru koncových bodů, do kterého budete směrovat zprávy. Služba směrování používá kontrakty, které definují tvar kanálů používaných k příjmu a odesílání zpráv, a proto tvar vstupního kanálu musí odpovídat tvaru výstupního kanálu. Pokud například směrujete na koncové body, které používají tvar kanálu odpovědi na požadavek, musíte pro příchozí koncové body, jako IRequestReplyRouterje například, použít kompatibilní kontrakt.
To znamená, že pokud cílové koncové body používají kontrakty s několika komunikačními vzory (například kombinováním jednosměrných a obousměrných operací), nemůžete vytvořit jeden koncový bod služby, který může přijímat a směrovat zprávy do všech z nich. Musíte určit, které koncové body mají kompatibilní obrazce, a definovat jeden nebo více koncových bodů služby, které se použijí k příjmu zpráv, které se mají směrovat do cílových koncových bodů.
Poznámka:
Při práci s kontrakty, které určují více komunikačních vzorů (například kombinaci jednosměrných a obousměrných operací), je alternativním řešením použít duplexní kontrakt ve službě směrování, například IDuplexSessionRouter. To však znamená, že vazba musí být schopná duplexní komunikace, což nemusí být možné pro všechny scénáře. V situacích, kdy to není možné, může být potřeba zohlednit komunikaci do více koncových bodů nebo upravit aplikaci.
Po definování koncového bodu služby můžete pomocí RoutingBehavior přidružit konkrétní RoutingConfiguration ke koncovému bodu. Při konfiguraci směrovací služby pomocí konfiguračního souboru se routingBehavior používá k určení tabulky filtru, která obsahuje logiku směrování použitou ke zpracování zpráv přijatých v tomto koncovém bodu. Pokud konfigurujete směrovací službu prostřednictvím kódu programu, můžete tabulku filtru zadat pomocí RoutingConfiguration.
Následující příklad definuje koncové body služby a klienta, které služba směrování používá programově i pomocí konfiguračního souboru.
<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));
Tento příklad nakonfiguruje směrovací službu tak, aby zpřístupnil jeden koncový bod s adresou http://localhost:8000/routingservice/router
, která se používá k příjmu zpráv, které se mají směrovat. Vzhledem k tomu, že se zprávy směrují na koncové body žádosti a odpovědi, koncový bod služby používá IRequestReplyRouter kontrakt. Tato konfigurace také definuje jeden koncový bod http://localhost:8000/servicemodelsample/service
klienta, do kterého se zprávy směrují. Tabulka filtrů (není zobrazena) s názvem "routingTable1" obsahuje logiku směrování používanou ke směrování zpráv a je přidružená ke koncovému bodu služby pomocí RoutingBehavioru (pro konfigurační soubor) nebo RoutingConfiguration (pro programovou konfiguraci).
Logika směrování
Pokud chcete definovat logiku směrování používanou ke směrování zpráv, musíte určit, jaká data obsažená v příchozích zprávách se dají jedinečně zpracovat. Pokud například všechny cílové koncové body, které směrujete tak, aby sdílely stejné akce SOAP, hodnota akce obsažená ve zprávě není dobrým indikátorem toho, do kterého konkrétního koncového bodu by měla být zpráva směrována. Pokud musíte jednoznačně směrovat zprávy do jednoho konkrétního koncového bodu, měli byste filtrovat data, která jednoznačně identifikuje cílový koncový bod, do kterého se zpráva směruje.
Služba směrování poskytuje několik implementací MessageFilter , které kontrolují konkrétní hodnoty ve zprávě, jako je adresa, akce, název koncového bodu nebo dokonce dotaz XPath. Pokud žádná z těchto implementací nevyhovuje vašim potřebám, můžete vytvořit vlastní implementaci MessageFilter . Další informace o filtrech zpráv a porovnání implementací používaných službou směrování najdete v tématu Filtry zpráv a výběr filtru.
Několik filtrů zpráv je uspořádaných do tabulek filtrů, které přidružují každý MessageFilter k cílovému koncovému bodu. Volitelně lze tabulku filtru použít také k určení seznamu zálohovaných koncových bodů, na které se služba směrování pokusí zprávu odeslat v případě selhání přenosu.
Ve výchozím nastavení se všechny filtry zpráv v tabulce filtru vyhodnocují současně; Můžete však zadat Priority , který způsobí, že filtry zpráv budou vyhodnoceny v určitém pořadí. Všechny položky s nejvyšší prioritou se vyhodnocují jako první a filtry zpráv s nižší prioritou se nevyhodnocují, pokud se shoda najde na vyšší úrovni priority. Další informace o tabulkách filtrů najdete v tématu Filtry zpráv.
Následující příklady používají MatchAllMessageFilterfunkci , která se vyhodnotí jako true
pro všechny zprávy. Tento MessageFilter se přidá do tabulky filtru "routingTable1", která přidruží MessageFilter ke koncovému bodu klienta s názvem CalculatorService. RoutingBehavior pak určuje, že tato tabulka by měla být použita ke směrování zpráv zpracovaných koncovým bodem služby.
<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);
Poznámka:
Ve výchozím nastavení služba směrování vyhodnocuje pouze hlavičky zprávy. Pokud chcete filtrům povolit přístup k textu zprávy, musíte nastavit RouteOnHeadersOnly .false
Vícesměrového vysílání
Přestože mnoho konfigurací směrovací služby používá exkluzivní logiku filtru, která směruje zprávy pouze do jednoho konkrétního koncového bodu, možná budete muset danou zprávu směrovat do více cílových koncových bodů. Pokud chcete zprávu vícesměrového vysílání přesměrovat do více cílů, musí být splněné následující podmínky:
Obrazec kanálu nesmí být odpověď na žádost (i když může být jednosměrná nebo duplexní), protože klientská aplikace může v reakci na požadavek přijímat pouze jednu odpověď.
Při vyhodnocování zprávy se musí vrátit
true
více filtrů.
Pokud jsou tyto podmínky splněny, zpráva se směruje do všech koncových bodů všech filtrů, které se vyhodnotí jako true
. Následující příklad definuje konfiguraci směrování, která vede ke směrování zpráv do obou koncových bodů, pokud je http://localhost:8000/routingservice/router/rounding
adresa koncového bodu ve zprávě .
<!--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);
Zpracování protokolu SOAP
Aby bylo možné podporovat směrování zpráv mezi různými protokoly, služba RoutingBehavior ve výchozím nastavení přidá SoapProcessingBehavior zprávy do všech koncových bodů klienta, na které se zprávy směrují. Toto chování automaticky vytvoří novou messageVersion před směrováním zprávy do koncového bodu a také vytvoří kompatibilní MessageVersion pro jakýkoli dokument odpovědi předtím, než ji vrátí do žádající klientské aplikace.
Postup vytvoření nové verze MessageVersion pro odchozí zprávu je následující:
Zpracování požadavků
Získejte MessageVersion odchozí vazby nebo kanálu.
Získejte čtečku textu pro původní zprávu.
Vytvořte novou zprávu se stejnou akcí, čtečkou textu a novou zprávou MessageVersion.
Pokud Addressing != Adresování.None, zkopírujte záhlaví To, From, FaultTo a RelatesTo s novou zprávou.
Zkopírujte všechny vlastnosti zprávy do nové zprávy.
Uložte původní zprávu požadavku, která se má použít při zpracování odpovědi.
Vrátí novou zprávu požadavku.
Zpracování odpovědí
Získejte MessageVersion původní zprávy požadavku.
Získejte čtenáře textu přijaté zprávy s odpovědí.
Vytvořte novou zprávu odpovědi se stejnou akcí, čtečkou textu a zprávou MessageVersion původní zprávy požadavku.
Pokud Addressing != Adresování.None, zkopírujte záhlaví To, From, FaultTo a RelatesTo s novou zprávou.
Zkopírujte vlastnosti zprávy do nové zprávy.
Vrátí novou zprávu odpovědi.
Ve výchozím nastavení se soapProcessingBehavior automaticky přidá do koncových bodů RoutingBehavior klienta při spuštění služby. Pomocí vlastnosti ale můžete určit, jestli se zpracování SOAP přidá do všech koncových bodů SoapProcessingEnabled klienta. Toto chování můžete také přidat přímo do konkrétního koncového bodu a povolit nebo zakázat toto chování na úrovni koncového bodu, pokud je vyžadováno podrobnější řízení zpracování protokolu SOAP.
Poznámka:
Pokud je pro koncový bod, který vyžaduje jinou verzi Zprávy než původní zpráva požadavku, je zakázané zpracování PROTOKOLU SOAP, musíte před odesláním zprávy do cílového koncového bodu zadat vlastní mechanismus pro provádění jakýchkoli úprav protokolu SOAP, které jsou vyžadovány.
V následujících příkladech se soapProcessingEnabled vlastnost používá k zabránění automatickému přidání SoapProcessingBehavior do všech koncových bodů klienta.
<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;
Dynamická konfigurace
Když přidáte další koncové body klienta nebo potřebujete upravit filtry, které se používají ke směrování zpráv, musíte mít možnost dynamicky aktualizovat konfiguraci za běhu, aby nedošlo k přerušení služby na koncové body, které aktuálně přijímají zprávy prostřednictvím služby směrování. Úprava konfiguračního souboru nebo kódu hostitelské aplikace není vždy dostatečná, protože každá metoda vyžaduje recyklaci aplikace, což by vedlo k potenciální ztrátě zpráv, které jsou právě přenášené, a potenciální výpadky při čekání na restartování služby.
Směrovací konfiguraci můžete upravovat pouze programově. Přestože můžete službu zpočátku nakonfigurovat pomocí konfiguračního souboru, můžete konfiguraci upravit pouze za běhu tak, že vytvoříte novou RoutingConfiguration a předáte ji jako parametr ApplyConfiguration metodě vystavené RoutingExtension rozšířením služby. Všechny aktuálně přenášené zprávy se budou směrovat pomocí předchozí konfigurace, zatímco zprávy přijaté po volání ApplyConfiguration používají novou konfiguraci. Následující příklad ukazuje vytvoření instance služby směrování a následné úpravy konfigurace.
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);
Poznámka:
Při aktualizaci směrovací služby tímto způsobem je možné předat pouze novou konfiguraci. Není možné upravovat pouze vybrané prvky aktuální konfigurace nebo připojit nové položky k aktuální konfiguraci; musíte vytvořit a předat novou konfiguraci, která nahradí stávající konfiguraci.
Poznámka:
Všechny relace otevřené pomocí předchozí konfigurace budou nadále používat předchozí konfiguraci. Nová konfigurace se používá jenom v nových relacích.
Zpracování chyb
Pokud při pokusu o odeslání zprávy dojde k nějaké CommunicationException chybě, provede se zpracování chyb. Tyto výjimky obvykle značí, že při pokusu o komunikaci s definovaným koncovým bodem klienta, jako EndpointNotFoundExceptionje například , ServerTooBusyExceptionnebo CommunicationObjectFaultedException. Kód zpracování chyb se také zachytí a pokusí se znovu odeslat, když TimeoutException dojde k chybě, což je další běžná výjimka, která není odvozena z třídy CommunicationException.
Pokud dojde k jedné z předchozích výjimek, služba směrování převezme služby při selhání seznamu koncových bodů zálohování. Pokud všechny koncové body zálohování selžou se selháním komunikace nebo pokud koncový bod vrátí výjimku, která značí selhání v rámci cílové služby, služba směrování vrátí klientovi chybu.
Poznámka:
Funkce zpracování chyb zachycuje a zpracovává výjimky, ke kterým dochází při pokusu o odeslání zprávy a při pokusu o zavření kanálu. Kód zpracování chyb není určen k detekci nebo zpracování výjimek vytvořených koncovými body aplikace, se kterými komunikuje; Vyvolána FaultException službou se zobrazí ve službě Routing Service jako FaultMessage a tok zpět do klienta.
Pokud dojde k chybě, když se směrovací služba pokusí předat zprávu, může se FaultException zobrazit na straně klienta, a EndpointNotFoundException ne obvykle se zobrazí v nepřítomnosti směrovací služby. Směrovací služba tak může maskovat výjimky a neposkytuje úplnou průhlednost, pokud neprověříte vnořené výjimky.
Výjimky trasování
Při odesílání zprávy do koncového bodu v seznamu selže služba Směrování trasuje výsledná data výjimek a připojí podrobnosti o výjimce jako vlastnost zprávy s názvem Exceptions. Tím se zachová data výjimek a umožníte uživateli programový přístup prostřednictvím inspektoru zpráv. Data výjimky se ukládají na zprávu ve slovníku, který mapuje název koncového bodu na podrobnosti o výjimce, ke kterým došlo při pokusu o odeslání zprávy.
Koncové body zálohování
Každá položka filtru v tabulce filtru může volitelně zadat seznam koncových bodů zálohování, které se použijí v případě selhání přenosu při odesílání do primárního koncového bodu. Pokud k takové chybě dojde, služba směrování se pokusí zprávu přenést na první položku v seznamu koncových bodů zálohování. Pokud při tomto pokusu o odeslání dojde také k selhání přenosu, zkusí se další koncový bod v seznamu záloh. Služba směrování pokračuje v odesílání zprávy do každého koncového bodu v seznamu, dokud zpráva nebude úspěšně přijata, všechny koncové body vrátí chybu přenosu nebo koncový bod nevrátí chybu přenosu.
Následující příklady nakonfigurují službu směrování tak, aby používala seznam záloh.
<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);
Podporované vzory chyb
Následující tabulka popisuje vzory, které jsou kompatibilní s používáním seznamů koncových bodů zálohování, a také poznámky popisující podrobnosti zpracování chyb pro konkrétní vzory.
Vzor | Relace | Transakce | Přijmout kontext | Podporovaný seznam záloh | Notes |
---|---|---|---|---|---|
Jednosměrný | Ano | Pokusí se zprávu znovu odeslat do koncového bodu zálohování. Pokud je tato zpráva vícesměrové vysílání, přesune se do cíle zálohování pouze zpráva v kanálu, který selhal. | |||
Jednosměrný | ✔️ | No | Vyvolá se výjimka a transakce se vrátí zpět. | ||
Jednosměrný | ✔️ | Ano | Pokusí se zprávu znovu odeslat do koncového bodu zálohování. Po úspěšném přijetí zprávy dokončete všechny kontexty příjmu. Pokud zpráva nebyla úspěšně přijata žádným koncovým bodem, nedokončí kontext příjmu. Pokud je tato zpráva vícesměrové vysílání, kontext příjmu se dokončí jenom v případě, že zprávu úspěšně přijme alespoň jeden koncový bod (primární nebo záloha). Pokud žádná z koncových bodů v žádné z cest vícesměrového vysílání úspěšně přijme zprávu, nedokončí kontext příjmu. |
||
Jednosměrný | ✔️ | ✔️ | Ano | Přerušte předchozí transakci, vytvořte novou transakci a znovu odešlete všechny zprávy. Zprávy, u které došlo k chybě, se přenesou do cíle zálohování. Po vytvoření transakce, ve které jsou všechny přenosy úspěšné, dokončete kontexty příjmu a potvrďte transakci. |
|
Jednosměrný | ✔️ | Ano | Pokusí se zprávu znovu odeslat do koncového bodu zálohování. Ve scénáři s vícesměrovým vysíláním se do cílů zálohování znovu zadají zprávy v relaci, u které došlo k chybě nebo v relaci, jejíž zavření relace selhalo. | ||
Jednosměrný | ✔️ | ✔️ | No | Vyvolá se výjimka a transakce se vrátí zpět. | |
Jednosměrný | ✔️ | ✔️ | Ano | Pokusí se zprávu znovu odeslat do koncového bodu zálohování. Po dokončení všech zpráv bez chyby relace relace indikuje žádné další zprávy a služba směrování úspěšně zavře všechny kanály odchozí relace, všechny kontexty příjmu jsou dokončeny a kanál příchozí relace je zavřený. | |
Jednosměrný | ✔️ | ✔️ | ✔️ | Ano | Přerušte aktuální transakci a vytvořte novou. Znovu odešlete všechny předchozí zprávy v relaci. Po vytvoření transakce, ve které byly úspěšně odeslány všechny zprávy a relace indikuje žádné další zprávy, všechny odchozí kanály relace jsou uzavřeny, přijímat kontexty jsou dokončeny s transakcí, kanál příchozí relace je uzavřen a transakce je potvrzena. Když jsou relace vícesměrové vysílání, zprávy, které neměly žádnou chybu, se znovu zasílají do stejného cíle jako předtím a zprávy, u které došlo k chybě, se odešlou do cílů zálohování. |
Obousměrný | Ano | Odešlete do cíle zálohování. Jakmile kanál vrátí zprávu s odpovědí, vraťte odpověď původnímu klientovi. | |||
Obousměrný | ✔️ | Ano | Odešlete všechny zprávy v kanálu do cíle zálohování. Jakmile kanál vrátí zprávu s odpovědí, vraťte odpověď původnímu klientovi. | ||
Obousměrný | ✔️ | No | Vyvolá se výjimka a transakce se vrátí zpět. | ||
Obousměrný | ✔️ | ✔️ | No | Vyvolá se výjimka a transakce se vrátí zpět. | |
Duplex | No | Komunikace bez relace není v současné době podporována. | |||
Duplex | ✔️ | Ano | Odešlete do cíle zálohování. |
Hostování
Vzhledem k tomu, že služba Směrování je implementována jako služba WCF, musí být buď v rámci aplikace, nebo hostovaná službou IIS nebo WAS. Doporučujeme, aby služba směrování byla hostována ve službě IIS, WAS nebo aplikaci služby systému Windows, aby využívala funkce správy automatického spuštění a životního cyklu dostupné v těchto hostitelských prostředích.
Následující příklad ukazuje hostování služby směrování v aplikaci.
using (ServiceHost serviceHost =
new ServiceHost(typeof(RoutingService)))
Pokud chcete hostovat službu směrování ve službě IIS nebo WAS, musíte buď vytvořit soubor služby (.svc), nebo použít aktivaci služby založenou na konfiguraci. Při použití souboru služby je nutné zadat RoutingService parametr Service. Následující příklad obsahuje ukázkový soubor služby, který lze použít k hostování směrovací služby se službou IIS nebo WAS.
<%@ ServiceHost Language="C#" Debug="true" Service="System.ServiceModel.Routing.RoutingService,
System.ServiceModel.Routing, version=4.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" %>
Služba směrování a zosobnění
Službu směrování WCF lze použít s zosobněním pro odesílání i příjem zpráv. Platí všechna obvyklá omezení zosobnění systému Windows. Pokud byste potřebovali nastavit oprávnění služby nebo účtu k používání zosobnění při psaní vlastní služby, budete muset udělat stejný postup, jak používat zosobnění se službou směrování. Další informace najdete v tématu Delegování a zosobnění.
Zosobnění se službou směrování vyžaduje použití ASP.NET zosobnění v režimu kompatibility ASP.NET nebo použití přihlašovacích údajů systému Windows, které byly nakonfigurovány tak, aby umožňovaly zosobnění. Další informace o režimu kompatibility ASP.NET naleznete v tématu Služby WCF a ASP.NET.
Upozorňující
Služba směrování WCF nepodporuje zosobnění se základním ověřováním.
Pokud chcete použít ASP.NET zosobnění se službou směrování, povolte v hostitelském prostředí služby režim kompatibility ASP.NET. Služba směrování již byla označena jako povolení režimu kompatibility ASP.NET a zosobnění se automaticky povolí. Zosobnění je jediným podporovaným využitím integrace ASP.NET se službou směrování.
Pokud chcete používat zosobnění přihlašovacích údajů systému Windows se službou směrování, musíte nakonfigurovat přihlašovací údaje i službu. Objekt přihlašovacích údajů klienta (WindowsClientCredentialpřístupný z ChannelFactory) definuje AllowedImpersonationLevel vlastnost, která musí být nastavena tak, aby povolovat zosobnění. Nakonec ve službě, kterou potřebujete nakonfigurovat ServiceAuthorizationBehavior chování nastavené ImpersonateCallerForAllOperations
na true
. Směrovací služba používá tento příznak k rozhodnutí, jestli se mají klienti vytvářet pro předávání zpráv s povolenou zosobněním.