Delen via


Aangepaste berichten onderschepping

Het MessageInterceptor-voorbeeld laat het gebruik van het model voor uitbreidbaarheid van het kanaal zien. In het bijzonder ziet u hoe u een aangepast bindingselement implementeert waarmee kanaalfactory's en kanaallisteners alle binnenkomende en uitgaande berichten op een bepaald moment in de runtimestack worden onderschept. Het voorbeeld bevat ook een client en server die het gebruik van deze aangepaste factory's demonstreren.

In dit voorbeeld zijn zowel de client als de service consoleprogramma's (.exe). De client en service maken beide gebruik van een gemeenschappelijke bibliotheek (.dll) die het aangepaste bindingselement en de bijbehorende runtimeobjecten bevat.

Notitie

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

In het voorbeeld wordt de aanbevolen procedure beschreven voor het maken van een aangepast gelaagd kanaal in WCF (Windows Communication Foundation), met behulp van het kanaalframework en de volgende best practices voor WCF. De stappen voor het maken van een aangepast gelaagd kanaal zijn als volgt:

  1. Bepaal welke van de kanaalvormen uw kanaalfactory en kanaallistener ondersteunen.

  2. Maak een kanaalfactory en een kanaallistener die ondersteuning biedt voor uw kanaalshapes.

  3. Voeg een bindingselement toe waarmee het aangepaste gelaagde kanaal wordt toegevoegd aan een kanaalstack.

  4. Voeg een sectie voor de extensie voor bindingselementen toe om het nieuwe bindingselement beschikbaar te maken voor het configuratiesysteem.

Kanaalshapes

De eerste stap bij het schrijven van een aangepast gelaagd kanaal is om te bepalen welke shapes vereist zijn voor het kanaal. Voor onze berichtcontrole ondersteunen we elke vorm die door de laag onder ons wordt ondersteund (bijvoorbeeld als de laag onder ons kan bouwen IOutputChannel en IDuplexSessionChannel, dan maken we ook beschikbaar IOutputChannel en IDuplexSessionChannel).

Channel Factory en Listener Factory

De volgende stap bij het schrijven van een aangepast gelaagd kanaal is het maken van een implementatie van IChannelFactory clientkanalen en IChannelListener servicekanalen.

Deze klassen nemen een interne factory en listener, en delegeren alle behalve de OnCreateChannel en OnAcceptChannel oproepen naar de binnenste factory en listener.

class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
    //...
}

class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
    //...
}

Een bindingselement toevoegen

In het voorbeeld wordt een aangepast bindingselement gedefinieerd: InterceptingBindingElement. InterceptingBindingElement neemt een ChannelMessageInterceptor invoer en gebruikt dit ChannelMessageInterceptor om berichten te manipuleren die er doorheen gaan. Dit is de enige klasse die openbaar moet zijn. De factory, listener en kanalen kunnen allemaal interne implementaties zijn van de openbare runtime-interfaces.

public class InterceptingBindingElement : BindingElement
{
}

Configuratieondersteuning toevoegen

Voor integratie met bindingsconfiguratie definieert de bibliotheek een configuratiesectie-handler als een sectie met de extensie voor bindingselementen. De client- en serverconfiguratiebestanden moeten de extensie voor het bindingselement registreren bij het configuratiesysteem. Implementeerfuncties die hun bindingselement beschikbaar willen maken voor het configuratiesysteem, kunnen worden afgeleid van deze klasse.

public abstract class InterceptingElement : BindingElementExtensionElement
{
    //...
}

Beleid toevoegen

Als u wilt integreren met ons beleidssysteem, InterceptingBindingElement implementeert u IPolicyExportExtension om aan te geven dat we moeten deelnemen aan het genereren van beleid. Ter ondersteuning van het importeren van beleid op een gegenereerde client kan de gebruiker een afgeleide klasse van InterceptingBindingElementImporter en onderdrukking CreateMessageInterceptor() registreren om hun klasse met beleid ChannelMessageInterceptor te genereren.

Voorbeeld: Droppable Message Inspector

Opgenomen in het voorbeeld is een voorbeeld van een implementatie ChannelMessageInspector waarvan berichten worden weggenomen.

class DroppingServerElement : InterceptingElement
{
    protected override ChannelMessageInterceptor CreateMessageInterceptor()
    {
        return new DroppingServerInterceptor();
    }
}

U kunt deze als volgt openen vanuit de configuratie:

<configuration>
    ...
    <system.serviceModel>
        ...
        <extensions>
            <bindingElementExtensions>
                <add name="droppingInterceptor"
                   type=
          "Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
            </bindingElementExtensions>
        </extensions>
    </system.serviceModel>
</configuration>

De client en server gebruiken beide deze zojuist gemaakte configuratiesectie om de aangepaste factory's in te voegen in het laagste niveau van hun runtimekanaalstacks (boven het transportniveau).

<customBinding>
  <binding name="sampleBinding">
    <droppingInterceptor/>
    <httpTransport/>
  </binding>
</customBinding>

De client gebruikt de MessageInterceptor bibliotheek om een aangepaste koptekst toe te voegen aan zelfs genummerde berichten. De service gebruikt MessageInterceptor daarentegen bibliotheek om berichten te verwijderen die niet over deze speciale koptekst beschikken.

U ziet nu de volgende clientuitvoer na het uitvoeren van de service en vervolgens de client.

Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client

De client rapporteert 10 verschillende windsnelheden aan de service, maar tagt slechts de helft ervan met de speciale koptekst.

In de service ziet u de volgende uitvoer:

Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.

Het voorbeeld instellen, compileren en uitvoeren

  1. Installeer ASP.NET 4.0 met de volgende opdracht.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  3. Volg de instructies in Het bouwen van de Windows Communication Foundation-voorbeelden om de oplossing te bouwen.

  4. Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.

  5. Voer Service.exe eerst Client.exe uit en bekijk beide consolevensters voor uitvoer.