Rozšíření dispečerů
Dispečeri zodpovídají za načítání příchozích zpráv z podkladových kanálů, jejich překlad do volání metod v kódu aplikace a odesílání výsledků zpět volajícímu. Rozšíření Dispečeru umožňují upravit toto zpracování. Můžete implementovat kontroly zpráv nebo parametrů, které kontrolují nebo upravují obsah zpráv nebo parametrů. Způsob směrování zpráv do operací můžete změnit nebo můžete poskytnout některé další funkce.
Toto téma popisuje, jak pomocí DispatchRuntime a DispatchOperation tříd v aplikaci služby WCF (Windows Communication Foundation) upravit výchozí chování spuštění dispečera nebo zachytit nebo upravit zprávy, parametry nebo vrátit hodnoty před odesláním nebo načtením z vrstvy kanálu. Další informace o ekvivalentním zpracování zpráv modulu runtime klienta naleznete v tématu Rozšíření klientů. Informace o roli, kterou IExtensibleObject<T> typy hrají při přístupu ke sdílenému stavu mezi různými objekty přizpůsobení modulu runtime, najdete v tématu Rozšiřitelné objekty.
Zasilatelé
Vrstva modelu služby provádí převod mezi programovacím modelem vývojáře a podkladovou výměnou zpráv, běžně označovanou jako vrstva kanálu. V kanálu a dispečerech koncových bodů (ChannelDispatcher a EndpointDispatcherv uvedeném pořadí) jsou komponenty služby zodpovědné za přijímání nových kanálů, příjem zpráv, odesílání operací a vyvolání a zpracování odpovědí. Objekty dispečera jsou objekty příjemce, ale implementace kontraktů zpětného volání v duplexní služby také zveřejňují své dispečerské objekty pro kontrolu, úpravy nebo rozšíření.
Dispečer kanálu (a doprovodný IChannelListener) vytáhne zprávy z podsávacího kanálu a předá je příslušnému dispečerovi koncového bodu. Každý dispečer koncového bodu má DispatchRuntime zprávu, která směruje zprávy do příslušného DispatchOperation, což je zodpovědné za volání metody, která implementuje operaci. Různé volitelné a požadované třídy rozšíření jsou vyvolány na cestě. Toto téma vysvětluje, jak se tyto části vejdou dohromady a jak můžete upravit vlastnosti a zapojit vlastní kód, aby se rozšířily základní funkce.
Vlastnosti dispečeru a upravené objekty přizpůsobení se vkládají pomocí objektů chování služby, koncového bodu, kontraktu nebo operací. Toto téma nepopisuje, jak používat chování. Další informace o typech používaných k vložení úprav dispečera naleznete v tématu Konfigurace a rozšíření modulu runtime s chováním.
Následující obrázek poskytuje základní zobrazení položek architektury ve službě.
Dispečeri kanálu
Vytvoří ChannelDispatcher se objekt, který přidruží IChannelListener konkrétní identifikátor URI (označovaný jako identifikátor URI naslouchání) k instanci služby. Každý ServiceHost objekt může mít mnoho ChannelDispatcher objektů, z nichž každý je přidružený jenom k jednomu naslouchacímu procesu a identifikátoru URI naslouchání. Když zpráva dorazí, ChannelDispatcher dotazuje se každý z přidružených EndpointDispatcher objektů, jestli koncový bod může zprávu přijmout, a předá zprávu do objektu, který může.
Všechny vlastnosti, které řídí životnost a chování relace kanálu, jsou k dispozici pro kontrolu nebo úpravy objektu ChannelDispatcher . Patří mezi ně vlastní inicializátory kanálu, naslouchací proces kanálu, hostitel, přidružený InstanceContextatd.
Dispečery koncových bodů
Objekt EndpointDispatcher je zodpovědný za zpracování zpráv ze ChannelDispatcher zprávy, když cílová adresa zprávy odpovídá AddressFilter vlastnosti a akce zprávy odpovídá ContractFilter vlastnosti. Pokud dva EndpointDispatcher objekty mohou přijmout zprávu, FilterPriority hodnota vlastnosti určuje koncový bod s vyšší prioritou.
EndpointDispatcher Použijte k získání dvou hlavních bodů rozšíření modelu služby – a DispatchRuntimeDispatchOperation tříd – které můžete použít k přizpůsobení zpracování dispečera. Třída DispatchRuntime umožňuje uživatelům zachytit a rozšířit dispečer v oboru kontraktu (to znamená pro všechny zprávy ve smlouvě). DispatchOperation Třída umožňuje uživatelům zachytit a rozšířit dispečer v oboru operace (to znamená pro všechny zprávy v operaci).
Scénáře
Existuje několik důvodů, proč dispečer rozšířit:
Vlastní ověření zpráv Uživatelé mohou vynutit platnost zprávy pro určité schéma. To lze provést implementací rozhraní průsečíku zpráv. Příklad najdete v části Kontroly zpráv.
Vlastní protokolování zpráv Uživatelé můžou zkontrolovat a protokolovat určitou sadu zpráv aplikace, které procházejí přes koncový bod. To lze provést také pomocí rozhraní průsečíku zpráv.
Vlastní transformace zpráv Uživatelé můžou na zprávu v modulu runtime použít určité transformace (například pro správu verzí). To lze provést znovu s rozhraními průsečíku zpráv.
Vlastní datový model. Uživatelé mohou mít jiný model serializace dat než ty, které jsou ve výchozím nastavení podporovány ve WCF (konkrétně System.Runtime.Serialization.DataContractSerializer, , System.Xml.Serialization.XmlSerializera nezpracovaných zpráv). To lze provést implementací rozhraní formátovače zpráv. Příklad najdete v části Formátovací modul operace a selektor operací.
Ověření vlastního parametru Uživatelé můžou vynutit platnost zadaných parametrů (na rozdíl od XML). To lze provést pomocí rozhraní inspektoru parametrů.
Odesílání vlastních operací. Uživatelé mohou implementovat odesílání na něco jiného než akci – například v základním prvku nebo u vlastní vlastnosti zprávy. To lze provést pomocí IDispatchOperationSelector rozhraní. Příklad najdete v části Formátovací modul operace a selektor operací.
Sdružováníobjektůch Uživatelé můžou instance fondu místo přidělení nové instance pro každé volání. To lze implementovat pomocí rozhraní zprostředkovatele instance. Příklad najdete v tématu Sdružování.
Instance Leasing. Uživatelé mohou implementovat model pronájmu po dobu životnosti instance, podobně jako u vzdálené komunikace rozhraní .NET Framework. Můžete to provést pomocí rozhraní doby života kontextu instance.
Vlastní zpracování chyb Uživatelé můžou řídit způsob zpracování místních chyb a způsob komunikace chyb zpět klientům. To lze implementovat pomocí IErrorHandler rozhraní.
Vlastní chování autorizace Uživatelé mohou implementovat vlastní řízení přístupu rozšířením částí kontraktu nebo operace za běhu a přidáním bezpečnostních kontrol na základě tokenů, které jsou přítomné ve zprávě. Toho lze dosáhnout pomocí rozhraní zachytávání zpráv nebo zachytávání parametrů. Příklady najdete v tématu Rozšiřitelnost zabezpečení.
Upozornění
Vzhledem k tomu, že změny vlastností zabezpečení mají potenciál ohrozit zabezpečení aplikací WCF, důrazně doporučujeme provádět úpravy související se zabezpečením s opatrností a důkladně testovat před nasazením.
Vlastní validátory modulu runtime WCF Můžete nainstalovat vlastní validátory, které prověřují služby, kontrakty a vazby a vynucují zásady na podnikové úrovni s ohledem na aplikace WCF. (Příklad: Viz Postupy: Uzamčení koncových bodů v podniku.)
Použití třídy DispatchRuntime
DispatchRuntime Třídu použijte buď ke změně výchozího chování služby nebo jednotlivého koncového bodu, nebo k vložení objektů, které implementují vlastní úpravy jednoho nebo obou následujících procesů služby (nebo klientských procesů v případě duplexního klienta):
Transformace příchozích zpráv na objekty a uvolnění těchto objektů jako metody vyvolání objektu služby.
Transformace objektů přijatých z odpovědi na vyvolání operace služby do odchozích zpráv.
Umožňuje DispatchRuntime zachytit a rozšířit dispečer kanálu nebo koncového bodu pro všechny zprávy v určitém kontraktu, i když se zpráva nerozpozná. Když přijde zpráva, která neodpovídá žádnému deklarovanému ve smlouvě, je odeslána do operace vrácené UnhandledDispatchOperation vlastností. Pokud chcete zachytit nebo rozšířit všechny zprávy pro konkrétní operaci, podívejte se na DispatchOperation třídu.
Existují čtyři hlavní oblasti rozšiřitelnosti dispečera DispatchRuntime vystavené třídou:
Součásti kanálu používají vlastnosti a vlastnosti DispatchRuntime přidruženého dispečera kanálu vráceného ChannelDispatcher vlastností k přizpůsobení způsobu, jakým dispečer kanálu přijímá a ukončuje kanály. Tato kategorie obsahuje vlastnosti ChannelInitializers a InputSessionShutdownHandlers vlastnosti.
Součásti zpráv jsou přizpůsobené pro každou zpracovanou zprávu. Tato kategorie zahrnuje vlastnost MessageInspectors, OperationSelectorOperationsa ErrorHandlers vlastnosti.
Komponenty instance přizpůsobují vytváření, životnost a odstraňování instancí typu služby. Další informace o životnosti objektů služby naleznete v InstanceContextMode této vlastnosti. Tato kategorie zahrnuje vlastnosti InstanceContextInitializers a InstanceProvider vlastnosti.
Součásti související se zabezpečením můžou používat následující vlastnosti:
SecurityAuditLogLocation označuje, kde se zapisují události auditu.
ImpersonateCallerForAllOperations určuje, jestli se služba pokusí zosobnit pomocí přihlašovacích údajů poskytovaných příchozí zprávou.
MessageAuthenticationAuditLevel určuje, zda jsou události úspěšného ověřování zpráv zapsány do protokolu událostí určeného SecurityAuditLogLocation.
PrincipalPermissionMode určuje, jak CurrentPrincipal je vlastnost nastavena.
ServiceAuthorizationAuditLevel určuje, jak se provádí auditování událostí autorizace.
SuppressAuditFailure určuje, zda se mají potlačit nekritické výjimky, ke kterým dochází během procesu protokolování.
Vlastní rozšiřující objekty jsou obvykle přiřazeny k DispatchRuntime vlastnosti nebo vloženy do kolekce chováním služby (objekt, který implementuje IServiceBehavior), chování kontraktu (objekt, který implementuje IContractBehavior) nebo chování koncového bodu (objekt, který implementuje IEndpointBehavior). Pak se objekt chování instalace přidá do příslušné kolekce chování buď programově, nebo implementací vlastního BehaviorExtensionElement objektu, který umožní vložení chování pomocí konfiguračního souboru aplikace.
Duplexní klienti (klienti, kteří implementují kontrakt zpětného volání určený duplexní službou) mají DispatchRuntime také objekt, ke kterému lze přistupovat pomocí CallbackDispatchRuntime vlastnosti.
Použití třídy DispatchOperation
Třída DispatchOperation je umístění pro úpravy za běhu a kurzor pro vlastní rozšíření, která jsou vymezena pouze na jednu operaci služby. (Chcete-li změnit chování za běhu služby pro všechny zprávy ve smlouvě, použijte DispatchRuntime třídu.)
Nainstalujte DispatchOperation úpravy pomocí objektu chování vlastní služby.
Operations Pomocí vlastnosti vyhledejte DispatchOperation objekt, který představuje konkrétní operaci služby.
Následující vlastnosti řídí spouštění modulu runtime na úrovni operace:
Vlastnost Action, , FaultContractInfosIsTerminatingReplyActionIsOneWay, a Name získat odpovídající hodnoty pro operaci.
TransactionRequired A určete TransactionAutoComplete chování transakce.
Vlastnosti ReleaseInstanceBeforeCall řídí ReleaseInstanceAfterCall životnost uživatelem definovaného objektu služby vzhledem k objektu InstanceContextslužby .
, DeserializeRequestSerializeReplya Formatter vlastnosti umožňují explicitní kontrolu nad převodem zpráv na objekty a objekty na zprávy.
Vlastnost Impersonation určuje úroveň zosobnění operace.
Vlastnost CallContextInitializers vloží vlastní rozšíření kontextu volání pro operaci.
Vlastnost AutoDisposeParameters řídí, když jsou objekty parametrů zničeny.
Vlastnost Invoker pro vložení vlastního objektu invokeru.
Tato ParameterInspectors vlastnost umožňuje vložit vlastní inspektor parametrů, který můžete použít ke kontrole nebo úpravě parametrů a návratových hodnot.