Delen via


Aanpasbare Kanaal Dispatcher

Het voorbeeld CustomChannelDispatcher laat zien hoe u de kanaalstack op een aangepaste manier bouwt door rechtstreeks te implementeren ServiceHostBase en hoe u een aangepaste kanaaldispatcher maakt in de webhostomgeving. De kanaaldispatcher werkt samen met IChannelListener om kanalen te accepteren en haalt berichten op uit de kanaalstapel. Dit voorbeeld biedt ook een basisvoorbeeld om te laten zien hoe u een kanaalstack in een webhostomgeving bouwt met behulp van VirtualPathExtension.

Custom ServiceHostBase

In dit voorbeeld wordt het basistype ServiceHostBase geïmplementeerd in plaats van ServiceHost te laten zien hoe u de IMPLEMENTATIE van de WCF-stack (Windows Communication Foundation) vervangt door een aangepaste laag voor berichtafhandeling boven op de kanaalstack. U overschrijft de virtuele methode InitializeRuntime om kanaallisteners en de kanaalzender te bouwen.

Als u een door het web gehoste service wilt implementeren, haalt u de service-extensie VirtualPathExtension op uit de Extensions verzameling en voegt u deze toe aan de BindingParameterCollection servicelaag, zodat de transportlaag weet hoe de kanaallistener moet worden geconfigureerd op basis van de instellingen van de hostingomgeving, dat wil zeggen de INSTELLINGEN van Internet Information Services (IIS)/Windows Process Activation Service (WAS).

Aanpasbare Kanaal Dispatcher

De aangepaste kanaal-dispatcher breidt het type ChannelDispatcherBaseuit. Met dit type wordt de programmeerlogica voor kanaallagen geïmplementeerd. In dit voorbeeld wordt alleen IReplyChannel ondersteund voor het exchange-patroon voor berichtuitwisseling met aanvragen en antwoorden, maar de aangepaste kanaalverzender kan eenvoudig worden uitgebreid naar andere kanaaltypen.

De dispatcher opent eerst de kanaalluisteraar en accepteert vervolgens het singleton reply-kanaal. Met het kanaal begint het berichten (aanvragen) in een oneindige lus te verzenden. Voor elke aanvraag wordt een antwoordbericht gemaakt en teruggestuurd naar de client.

Een antwoordbericht maken

De berichtverwerking wordt geïmplementeerd in het type MyServiceManager. In de HandleRequest methode wordt eerst de Action koptekst van het bericht gecontroleerd om te zien of de aanvraag wordt ondersteund. Er wordt een vooraf gedefinieerde SOAP-actie http://tempuri.org/HelloWorld/Hello gedefinieerd om berichtfiltering te bieden. Dit is vergelijkbaar met het servicecontractconcept in de WCF-implementatie van ServiceHost.

Voor de juiste SOAP-actiecase haalt het voorbeeld de aangevraagde berichtgegevens op en genereert het een corresponderend antwoord op de aanvraag, vergelijkbaar met wat in het ServiceHost geval wordt gezien.

U hebt het HTTP-GET werkwoord speciaal afgehandeld door een aangepast HTML-bericht te retourneren, in dit geval, zodat u in een browser door de service kunt bladeren om te zien dat het correct is gecompileerd. Als de SOAP-actie niet overeenkomt, stuurt u een foutbericht terug om aan te geven dat de aanvraag niet wordt ondersteund.

De client van dit voorbeeld is een normale WCF-client die niets van de service aanneemt. De service is dus speciaal ontworpen om te voldoen aan wat u krijgt van een normale WCF-implementatieServiceHost . Als gevolg hiervan is alleen een servicecontract vereist voor de client.

Het voorbeeld gebruiken

Als u de clienttoepassing uitvoert, wordt de volgende uitvoer rechtstreeks gegenereerd.

Client is talking to a request/reply WCF service.
Type what you want to say to the server: Howdy
Server replied: You said: Howdy. Message id: 1
Server replied: You said: Howdy. Message id: 2
Server replied: You said: Howdy. Message id: 3
Server replied: You said: Howdy. Message id: 4
Server replied: You said: Howdy. Message id: 5

U kunt ook door de service bladeren vanuit een browser, zodat een HTTP-GET bericht op de server wordt verwerkt. Hiermee krijgt u goed opgemaakte HTML-tekst terug.