Clients uitbreiden
In een aanroepende toepassing is de servicemodellaag verantwoordelijk voor het vertalen van methode-aanroepen in toepassingscode naar uitgaande berichten, het pushen ervan naar de onderliggende kanalen, het omzetten van resultaten in retourwaarden en outparameters in de toepassingscode en het retourneren van de resultaten naar de aanroeper. Servicemodelextensies wijzigen of implementeren uitvoerings- of communicatiegedrag en -functies met betrekking tot client- of dispatcherfunctionaliteit, aangepast gedrag, bericht- en parameteronderschepping en andere uitbreidbaarheidsfunctionaliteit.
In dit onderwerp wordt beschreven hoe u de ClientRuntime en ClientOperation klassen in een WCF-clienttoepassing (Windows Communication Foundation) kunt gebruiken om het standaardgedrag van een WCF-client te wijzigen of berichten, parameters te onderscheppen of te wijzigen, of waarden te retourneren voor of later om ze te verzenden of op te halen uit de kanaallaag. Zie Dispatchers uitbreiden voor meer informatie over het uitbreiden van de serviceruntime. Zie De runtime configureren en uitbreiden met gedrag voor meer informatie over het gedrag waarmee aanpassingsobjecten worden gewijzigd en ingevoegd in de clientruntime.
Clients
Op een client converteert een WCF-clientobject of clientkanaal methode-aanroepen naar uitgaande berichten en binnenkomende berichten naar bewerkingsresultaten die worden geretourneerd naar de aanroepende toepassing. (Zie voor meer informatie over clienttypen WCF-clientarchitectuur.)
WCF-clienttypen hebben runtimetypen die deze functionaliteit op eindpunt- en bewerkingsniveau verwerken. Wanneer een toepassing een bewerking aanroept, ClientOperation worden de uitgaande objecten omgezet in een bericht, worden snijpunten verwerkt, wordt bevestigd dat de uitgaande oproep voldoet aan het doelcontract en wordt het uitgaande bericht verzonden naar het ClientRuntime, dat verantwoordelijk is voor het maken en beheren van uitgaande kanalen (en inkomende kanalen in het geval van dubbelzijdige services), het verwerken van extra uitgaande berichtverwerking (zoals headerwijziging), het verwerken van berichtinter interceptors in beide richtingen en het routeren van binnenkomende duplex-aanroepen naar het juiste object aan de clientzijde DispatchRuntime . Zowel de ClientOperation als ClientRuntime bieden vergelijkbare services wanneer berichten (inclusief fouten) naar de client worden geretourneerd.
Deze twee runtimeklassen zijn de belangrijkste extensie voor het aanpassen van de verwerking van WCF-clientobjecten en -kanalen. Met de ClientRuntime klasse kunnen gebruikers de uitvoering van clients onderscheppen en uitbreiden voor alle berichten in het contract. Met de ClientOperation klasse kunnen gebruikers de uitvoering van clients onderscheppen en uitbreiden voor alle berichten in een bepaalde bewerking.
Het wijzigen van de eigenschappen of het invoegen van aanpassingen wordt uitgevoerd met behulp van contract-, eindpunt- en bewerkingsgedrag. Zie De runtime configureren en uitbreiden met gedrag voor meer informatie over het gebruik van dit type gedrag om runtime-aanpassingen van de client uit te voeren.
Scenario's
Er zijn verschillende redenen om het clientsysteem uit te breiden, waaronder:
Aangepaste berichtvalidatie. Een gebruiker kan afdwingen dat een bericht geldig is voor een bepaald schema. Dit kan worden gedaan door de IClientMessageInspector interface te implementeren en de implementatie toe te wijzen aan de MessageInspectors eigenschap. Zie Voor voorbeelden : Berichten op de client inspecteren of wijzigen en berichten inspecteren of wijzigen op de client.
Aangepaste logboekregistratie van berichten. Een gebruiker kan een aantal toepassingsberichten die door een eindpunt stromen, inspecteren en registreren. Dit kan ook worden bereikt met de snijpuntinterfaces voor berichten.
Aangepaste berichttransformaties. In plaats van toepassingscode te wijzigen, wil de gebruiker mogelijk bepaalde transformaties toepassen op het bericht in de runtime (bijvoorbeeld voor versiebeheer). Dit kan opnieuw worden bereikt met de snijpuntinterfaces voor berichten.
Aangepast gegevensmodel. Een gebruiker wil mogelijk een ander gegevens- of serialisatiemodel hebben dan het model dat standaard wordt ondersteund in WCF (namelijk, System.Runtime.Serialization.DataContractSerializer, System.Xml.Serialization.XmlSerializeren System.ServiceModel.Channels.Message objecten). Dit kan worden gedaan door de berichtindelingsinterfaces te implementeren. Zie en de ClientOperation.Formatter eigenschap voor meer informatieSystem.ServiceModel.Dispatcher.IClientMessageFormatter.
Validatie van aangepaste parameters. Een gebruiker wil mogelijk afdwingen dat getypte parameters geldig zijn (in plaats van XML). Dit kan worden gedaan met behulp van de interfaces voor parametercontrole. Zie Voor een voorbeeld : Parameters of clientvalidatie controleren of wijzigen.
De ClientRuntime-klasse gebruiken
De ClientRuntime klasse is een uitbreidbaarheidspunt waarop u extensieobjecten kunt toevoegen die berichten onderscheppen en het gedrag van de client uitbreiden. Onderscheppingsobjecten kunnen alle berichten in een bepaald contract verwerken, alleen berichten verwerken voor bepaalde bewerkingen, aangepaste kanaal initialisatie uitvoeren en ander aangepast gedrag van clienttoepassingen implementeren.
De CallbackDispatchRuntime eigenschap retourneert het runtime-object voor verzending voor door de service geïnitieerde callback-clients.
De OperationSelector eigenschap accepteert een object voor een aangepaste bewerkingskiezer.
Met ChannelInitializers de eigenschap kan een kanaal-initialisatiefunctie worden toegevoegd die het clientkanaal kan inspecteren of wijzigen.
De Operations eigenschap haalt een verzameling ClientOperation objecten op waaraan u aangepaste onderscheppingsfuncties voor berichten kunt toevoegen die specifiek zijn voor de berichten van die bewerking.
Met de ManualAddressing eigenschap kan een toepassing bepaalde automatische adresseringsheaders uitschakelen om rechtstreeks de adressering te beheren.
De Via eigenschap stelt de waarde van de bestemming van het bericht op transportniveau in om tussenpersonen en andere scenario's te ondersteunen.
De MessageInspectors eigenschap haalt een verzameling IClientMessageInspector objecten op waaraan u aangepaste bericht interceptors kunt toevoegen voor alle berichten die via een WCF-client reizen.
Daarnaast zijn er een aantal andere eigenschappen waarmee de contractgegevens worden opgehaald:
Als de WCF-client een duplex WCF-client is, halen de volgende eigenschappen ook de callback WCF-clientgegevens op:
Als u de uitvoering van WCF-clients wilt uitbreiden voor een volledige WCF-client, controleert u de eigenschappen die beschikbaar zijn in de ClientRuntime klasse om te zien of u een eigenschap wijzigt of een interface implementeert en deze toevoegt aan een eigenschap, de functionaliteit die u zoekt. Zodra u een bepaalde extensie hebt gekozen om te bouwen, voegt u de extensie in de juiste ClientRuntime eigenschap in door een clientgedrag te implementeren dat toegang biedt tot de klasse wanneer deze ClientRuntime wordt aangeroepen.
U kunt aangepaste extensieobjecten invoegen in een verzameling met behulp van een bewerkingsgedrag (een object dat implementeert IOperationBehavior), een contractgedrag (een object dat implementeert IContractBehavior) of een eindpuntgedrag (een object dat wordt geïmplementeerd IEndpointBehavior). Het installatiegedragsobject wordt toegevoegd aan de juiste verzameling gedrag via programmacode,declaratief (door een aangepast kenmerk te implementeren) of door een aangepast BehaviorExtensionElement object te implementeren om het gedrag in te voegen met behulp van een toepassingsconfiguratiebestand. Zie De runtime configureren en uitbreiden met gedrag voor meer informatie.
Zie Instructies voor het controleren of wijzigen van berichten op de client voor voorbeelden van onderschepping in een WCF-client.
De ClientOperation-klasse gebruiken
De ClientOperation klasse is de locatie voor runtimewijzigingen van de client en het invoegpunt voor aangepaste extensies die beperkt zijn tot slechts één servicebewerking. (Als u het runtimegedrag van de client voor alle berichten in een contract wilt wijzigen, gebruikt u de ClientRuntime klasse.)
Gebruik de Operations eigenschap om het ClientOperation object te zoeken dat een bepaalde servicebewerking vertegenwoordigt. Met de volgende eigenschappen kunt u aangepaste objecten invoegen in het WCF-clientsysteem:
Gebruik de Formatter eigenschap om een aangepaste IClientMessageFormatter implementatie in te voegen voor een bewerking of om de huidige formatter te wijzigen.
Gebruik de ParameterInspectors eigenschap om een aangepaste IParameterInspector implementatie in te voegen of om de huidige te wijzigen.
Met de volgende eigenschappen kunt u het systeem wijzigen in interactie met de formatter en aangepaste parametercontrole:
Gebruik de SerializeRequest eigenschap om de serialisatie van een uitgaand bericht te beheren.
Gebruik de DeserializeReply eigenschap om deserialisatie van een binnenkomend bericht te beheren.
Gebruik de Action eigenschap om de WS-Adresseringsactie van het aanvraagbericht te beheren.
Gebruik de BeginMethod en EndMethod om op te geven welke WCF-clientmethoden zijn gekoppeld aan een asynchrone bewerking.
Gebruik de FaultContractInfos eigenschap om een verzameling op te halen die de typen bevat die kunnen worden weergegeven in SOAP-fouten als het detailtype.
Gebruik de IsInitiating en IsTerminating eigenschappen om te bepalen of een sessie wordt gestart of wordt afgebroken wanneer de bewerking wordt aangeroepen.
Gebruik de IsOneWay eigenschap om te bepalen of de bewerking een eenrichtingsbewerking is.
Gebruik de Parent eigenschap om het bijbehorende ClientRuntime object te verkrijgen.
Gebruik de Name eigenschap om de naam van de bewerking op te halen.
Gebruik de SyncMethod eigenschap om te bepalen welke methode aan de bewerking is toegewezen.
Als u de uitvoering van WCF-clients wilt uitbreiden voor slechts één servicebewerking, controleert u de eigenschappen die beschikbaar zijn in de ClientOperation klasse om te zien of u een eigenschap wijzigt of een interface implementeert en deze toevoegt aan een eigenschap, de functionaliteit die u zoekt. Zodra u een bepaalde extensie hebt gekozen om te bouwen, voegt u de extensie in de juiste ClientOperation eigenschap in door een clientgedrag te implementeren dat toegang biedt tot de klasse wanneer deze ClientOperation wordt aangeroepen. Binnen dat gedrag kunt u vervolgens de ClientRuntime eigenschap aanpassen aan uw vereisten.
Normaal gesproken volstaat het implementeren van een bewerkingsgedrag (een object dat de IOperationBehavior interface implementeert), maar u kunt ook eindpuntgedrag en contractgedrag gebruiken om hetzelfde te bereiken door het OperationDescription voor een bepaalde bewerking te zoeken en het gedrag daar te koppelen. Zie De runtime configureren en uitbreiden met gedrag voor meer informatie.
Als u uw aangepaste gedrag wilt gebruiken vanuit de configuratie, installeert u uw gedrag met behulp van een handler voor aangepaste gedragsconfiguratie. U kunt uw gedrag ook installeren door een aangepast kenmerk te maken.
Zie How to: Inspect or Modify Parameters (Parameters inspecteren of wijzigen) voor voorbeelden van onderschepping in een WCF-client.