Dispatchers uitbreiden
Dispatchers zijn verantwoordelijk voor het ophalen van binnenkomende berichten uit de onderliggende kanalen, het omzetten ervan in methode-aanroepen in toepassingscode en het terugsturen van de resultaten naar de aanroeper. Met dispatcher-extensies kunt u deze verwerking wijzigen. U kunt bericht- of parametercontroles implementeren die de inhoud van berichten of parameters inspecteren of wijzigen. U kunt de manier wijzigen waarop berichten worden doorgestuurd naar bewerkingen of bepaalde andere functionaliteit bieden.
In dit onderwerp wordt beschreven hoe u de DispatchRuntime en DispatchOperation klassen in een WCF-servicetoepassing (Windows Communication Foundation) kunt gebruiken om het standaardgedrag van een dispatcher te wijzigen of berichten, parameters te onderscheppen of te wijzigen of waarden te retourneren vóór of na het verzenden of ophalen uit de kanaallaag. Zie Clients uitbreiden voor meer informatie over de equivalente verwerking van clientruntimeberichten. Zie Extensible Objects voor meer informatie over de rol die IExtensibleObject<T> typen spelen bij het openen van de gedeelde status tussen verschillende runtime-aanpassingsobjecten.
Dispatchers
De servicemodellaag voert de conversie uit tussen het programmeermodel van de ontwikkelaar en de onderliggende berichtuitwisseling, ook wel de kanaallaag genoemd. In WCF zijn de kanaal- en eindpuntverzenders (ChannelDispatcher respectievelijk EndpointDispatcher) de serviceonderdelen die verantwoordelijk zijn voor het accepteren van nieuwe kanalen, het ontvangen van berichten, het verzenden en aanroepen van bewerkingen en het verwerken van reacties. Dispatcher-objecten zijn ontvangerobjecten, maar callbackcontract-implementaties in duplexservices maken ook hun dispatcherobjecten beschikbaar voor inspectie, wijziging of uitbreiding.
De kanaal-dispatcher (en metgezel IChannelListener) haalt berichten uit het onderliggende kanaal en geeft de berichten door aan hun respectieve eindpunt-dispatchers. Elke eindpunt-dispatcher heeft een DispatchRuntime die berichten doorstuurt naar de juiste DispatchOperation, die verantwoordelijk is voor het aanroepen van de methode waarmee de bewerking wordt geïmplementeerd. Er worden onderweg verschillende optionele en vereiste uitbreidingsklassen aangeroepen. In dit onderwerp wordt uitgelegd hoe deze onderdelen bij elkaar passen en hoe u eigenschappen kunt wijzigen en uw eigen code kunt aansluiten om de basisfunctionaliteit uit te breiden.
Dispatchereigenschappen en gewijzigde aanpassingsobjecten worden ingevoegd met behulp van service-, eindpunt-, contract- of bewerkingsgedragsobjecten. In dit onderwerp wordt niet beschreven hoe u gedrag gebruikt. Zie De runtime configureren en uitbreiden met gedrag voor meer informatie over de typen die worden gebruikt voor het invoegen van dispatcherwijzigingen.
De volgende afbeelding biedt een algemeen overzicht van de architectuuritems in een service.
Kanaal-dispatchers
Er ChannelDispatcher wordt een object gemaakt om een IChannelListener op een bepaalde URI (een listen-URI genoemd) te koppelen aan een exemplaar van een service. Elk ServiceHost object kan veel ChannelDispatcher objecten bevatten, elk gekoppeld aan slechts één listener en listen-URI. Wanneer een bericht binnenkomt, voert de ChannelDispatcher query's uit op elk van de gekoppelde EndpointDispatcher objecten of het eindpunt het bericht kan accepteren en geeft het bericht door aan het bericht dat dat kan.
Alle eigenschappen die de levensduur en het gedrag van een kanaalsessie bepalen, zijn beschikbaar voor inspectie of wijziging van het ChannelDispatcher object. Dit zijn aangepaste kanaal-initializers, de kanaallistener, de host, de bijbehorende InstanceContext, enzovoort.
Eindpunt-dispatchers
Het EndpointDispatcher object is verantwoordelijk voor het verwerken van berichten van een ChannelDispatcher wanneer het doeladres van een bericht overeenkomt met de AddressFilter en de berichtactie overeenkomt met de ContractFilter eigenschap. Als twee EndpointDispatcher objecten een bericht kunnen accepteren, bepaalt de FilterPriority eigenschapswaarde het eindpunt met een hogere prioriteit.
Gebruik de EndpointDispatcher functie om de twee belangrijkste servicemodeluitbreidingspunten ( de DispatchRuntime en DispatchOperation klassen) te verkrijgen die u kunt gebruiken om de verwerking van de dispatcher aan te passen. Met DispatchRuntime de klasse kunnen gebruikers de dispatcher onderscheppen en uitbreiden op het contractbereik (dat wil zeggen voor alle berichten in een contract). Met DispatchOperation de klasse kunnen gebruikers de dispatcher onderscheppen en uitbreiden op een bewerkingsbereik (dat wil bijvoorbeeld voor alle berichten in een bewerking).
Scenario's
Er zijn verschillende redenen om de dispatcher uit te breiden:
Aangepaste berichtvalidatie. Gebruikers kunnen afdwingen dat een bericht geldig is voor een bepaald schema. Dit kan worden gedaan door de snijpuntinterfaces voor berichten te implementeren. Zie Berichtcontrole voor een voorbeeld.
Aangepaste logboekregistratie van berichten. Gebruikers kunnen een aantal toepassingsberichten die door een eindpunt stromen, inspecteren en registreren. Dit kan ook worden bereikt met de snijpuntinterfaces voor berichten.
Aangepaste berichttransformaties. Gebruikers kunnen bepaalde transformaties toepassen op het bericht in de runtime (bijvoorbeeld voor versiebeheer). Dit kan opnieuw worden bereikt met de snijpuntinterfaces voor berichten.
Aangepast gegevensmodel. Gebruikers kunnen een ander model voor gegevensserialisatie hebben dan het model dat standaard wordt ondersteund in WCF (namelijk, System.Runtime.Serialization.DataContractSerializerSystem.Xml.Serialization.XmlSerializer, en onbewerkte berichten). Dit kan worden gedaan door de berichtindelingsinterfaces te implementeren. Zie Bijvoorbeeld Bewerkingsopmaak en Bewerkingskiezer.
Validatie van aangepaste parameters. Gebruikers kunnen afdwingen dat getypte parameters geldig zijn (in plaats van XML). Dit kan worden gedaan met behulp van de interfaces voor parametercontrole.
Verzending van aangepaste bewerkingen. Gebruikers kunnen verzending implementeren op iets anders dan actie, bijvoorbeeld op het hoofdtekstelement of op een aangepaste berichteigenschap. Dit kan worden gedaan met behulp van de IDispatchOperationSelector interface. Zie Bijvoorbeeld Bewerkingsopmaak en Bewerkingskiezer.
Objectpooling. Gebruikers kunnen exemplaren groeperen in plaats van een nieuw exemplaar toe te wijzen voor elke aanroep. Dit kan worden geïmplementeerd met behulp van de interfaces van de instantieprovider. Zie Pooling voor een voorbeeld.
Exemplaar leasen. Gebruikers kunnen een leasepatroon implementeren voor bijvoorbeeld levensduur, vergelijkbaar met die van .NET Framework Remoting. Dit kan worden gedaan met behulp van de interface voor de levensduur van de instantiecontext.
Aangepaste foutafhandeling. Gebruikers kunnen bepalen hoe zowel lokale fouten worden verwerkt als hoe fouten worden gecommuniceerd naar clients. Dit kan worden geïmplementeerd met behulp van de IErrorHandler interfaces.
Aangepast autorisatiegedrag. Gebruikers kunnen aangepast toegangsbeheer implementeren door de runtimeonderdelen Contract of Bewerking uit te breiden en beveiligingscontroles toe te voegen op basis van de tokens die aanwezig zijn in het bericht. Dit kan worden bereikt met behulp van de snijpuntinterfaces voor berichten of parameters. Zie Beveiligingsuitbreidbaarheid voor voorbeelden.
Let op
Omdat het wijzigen van beveiligingseigenschappen de beveiliging van WCF-toepassingen in gevaar kan brengen, is het raadzaam om beveiligingsgerelateerde wijzigingen met zorg uit te voeren en grondig te testen vóór de implementatie.
Aangepaste WCF Runtime Validators. U kunt aangepaste validators installeren die services, contracten en bindingen onderzoeken om beleid op ondernemingsniveau af te dwingen met betrekking tot WCF-toepassingen. (Zie bijvoorbeeld Procedure: Eindpunten vergrendelen in de onderneming.)
De DispatchRuntime-klasse gebruiken
Gebruik de DispatchRuntime klasse om het standaardgedrag van een service of afzonderlijk eindpunt te wijzigen, of om objecten in te voegen die aangepaste wijzigingen implementeren in een of beide van de volgende serviceprocessen (of clientprocessen in het geval van een duplex-client):
De transformatie van binnenkomende berichten in objecten en het vrijgeven van deze objecten als methode-aanroepen op een serviceobject.
De transformatie van objecten die zijn ontvangen van het antwoord op een servicebewerking in uitgaande berichten.
Hiermee DispatchRuntime kunt u het kanaal of de eindpunt-dispatcher voor alle berichten in een bepaald contract onderscheppen en uitbreiden, zelfs wanneer een bericht niet wordt herkend. Wanneer een bericht binnenkomt dat niet overeenkomt met een opgegeven in het contract, wordt het verzonden naar de bewerking die door de UnhandledDispatchOperation eigenschap wordt geretourneerd. Als u alle berichten voor een bepaalde bewerking wilt onderscheppen of uitbreiden, raadpleegt u de DispatchOperation klasse.
Er zijn vier hoofdgebieden van de uitbreidbaarheid van de dispatcher die door de DispatchRuntime klasse worden weergegeven:
Kanaalonderdelen gebruiken de eigenschappen van de DispatchRuntime en die van de gekoppelde kanaal-dispatcher die door de ChannelDispatcher eigenschap worden geretourneerd om aan te passen hoe de kanaal-dispatcher kanalen accepteert en sluit. Deze categorie bevat de ChannelInitializers en InputSessionShutdownHandlers eigenschappen.
Berichtonderdelen worden aangepast voor elk verwerkt bericht. Deze categorie bevat de MessageInspectorseigenschappen , OperationSelectoren Operationsde ErrorHandlers eigenschappen.
Exemplaaronderdelen passen het maken, de levensduur en de verwijdering van exemplaren van het servicetype aan. Zie de eigenschap voor meer informatie over levensduur InstanceContextMode van serviceobjecten. Deze categorie bevat de InstanceContextInitializers en de InstanceProvider eigenschappen.
Beveiligingsgerelateerde onderdelen kunnen de volgende eigenschappen gebruiken:
SecurityAuditLogLocation geeft aan waar auditgebeurtenissen zijn geschreven.
ImpersonateCallerForAllOperations bepaalt of de service probeert te imiteren met behulp van de referenties die zijn opgegeven door het binnenkomende bericht.
MessageAuthenticationAuditLevel bepaalt of geslaagde berichtenverificatie-gebeurtenissen naar het gebeurtenislogboek worden geschreven dat is opgegeven door SecurityAuditLogLocation.
PrincipalPermissionMode bepaalt hoe de CurrentPrincipal eigenschap is ingesteld.
ServiceAuthorizationAuditLevel geeft aan hoe de controle van autorisatie-gebeurtenissen wordt uitgevoerd.
SuppressAuditFailure geeft aan of er niet-kritieke uitzonderingen moeten worden onderdrukt die optreden tijdens het logboekregistratieproces.
Aangepaste extensieobjecten worden doorgaans toegewezen aan een DispatchRuntime eigenschap of ingevoegd in een verzameling door een servicegedrag (een object dat implementeert IServiceBehavior), een contractgedrag (een object dat implementeert IContractBehavior) of een eindpuntgedrag (een object dat implementeert IEndpointBehavior). Vervolgens wordt het installatiegedragsobject toegevoegd aan de juiste verzameling gedrag via een programma of door een aangepast BehaviorExtensionElement object te implementeren om het gedrag in te voegen met behulp van een toepassingsconfiguratiebestand.
Duplex-clients (clients die een callback-contract implementeren dat is opgegeven door een duplex-service) hebben ook een DispatchRuntime object dat toegankelijk is via de CallbackDispatchRuntime eigenschap.
De DispatchOperation-klasse gebruiken
De DispatchOperation klasse is de locatie voor runtimewijzigingen en de invoegpositie voor aangepaste extensies die zijn beperkt tot slechts één servicebewerking. (Als u het gedrag van de serviceruntime voor alle berichten in een contract wilt wijzigen, gebruikt u de DispatchRuntime klasse.)
Installeer DispatchOperation wijzigingen met behulp van een aangepast servicegedragsobject.
Gebruik de Operations eigenschap om het DispatchOperation object te zoeken dat een bepaalde servicebewerking vertegenwoordigt.
De volgende eigenschappen bepalen de uitvoering van runtime op bewerkingsniveau:
De Actioneigenschappen , , ReplyActionFaultContractInfos, IsOneWayen IsTerminatingName eigenschappen verkrijgen de respectieve waarden voor de bewerking.
Het TransactionAutoComplete gedrag van de transactie en TransactionRequired geeft dit op.
De ReleaseInstanceBeforeCall en ReleaseInstanceAfterCall eigenschappen bepalen de levensduur van het door de gebruiker gedefinieerde serviceobject ten opzichte van de InstanceContext.
De DeserializeRequesteigenschappen , SerializeReplyen de Formatter eigenschappen maken expliciete controle over de conversie van berichten naar objecten en objecten naar berichten mogelijk.
De Impersonation eigenschap geeft het bewerkingsimitatieniveau op.
Met CallContextInitializers de eigenschap worden aangepaste aanroepcontextextensies voor de bewerking ingevoegd.
De AutoDisposeParameters eigenschap bepaalt wanneer parameterobjecten worden vernietigd.
De Invoker eigenschap voor het invoegen van een aangepast aanroeperobject.
Met de ParameterInspectors eigenschap kunt u een aangepaste parametercontrole invoegen die u kunt gebruiken om parameters te inspecteren of te wijzigen en waarden te retourneren.