Dela via


Anpassad meddelandeavlyssnare

Exemplet MessageInterceptor visar användningen av kanalutökningsmodellen. I synnerhet visar den hur du implementerar ett anpassat bindningselement som skapar kanalfabriker och kanallyssnare för att fånga upp alla inkommande och utgående meddelanden vid en viss tidpunkt i körningsstacken. Exemplet innehåller även en klient och server som visar användningen av dessa anpassade fabriker.

I det här exemplet är både klienten och tjänsten konsolprogram (.exe). Både klienten och tjänsten använder ett gemensamt bibliotek (.dll) som innehåller det anpassade bindningselementet och dess associerade körningsobjekt.

Kommentar

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Exemplet beskriver den rekommenderade proceduren för att skapa en anpassad skiktad kanal i Windows Communication Foundation (WCF), med hjälp av kanalramverket och följande metodtips för WCF. Stegen för att skapa en anpassad kanal i lager är följande:

  1. Bestäm vilken av kanalens former din kanalfabrik och kanallyssnare ska stödja.

  2. Skapa en kanalfabrik och en kanallyssnare som stöder dina kanalformer.

  3. Lägg till ett bindningselement som lägger till den anpassade skiktade kanalen i en kanalstack.

  4. Lägg till ett avsnitt för bindningselementtillägg för att exponera det nya bindningselementet för konfigurationssystemet.

Kanalformer

Det första steget när du skriver en anpassad kanal i lager är att bestämma vilka former som krävs för kanalen. För vår meddelandekontroll stöder vi alla former som lagret under oss stöder (till exempel om lagret under oss kan skapa IOutputChannel och IDuplexSessionChannel, då exponerar IOutputChannel vi också och IDuplexSessionChannel).

Channel Factory och Listener Factory

Nästa steg i att skriva en anpassad kanal i lager är att skapa en implementering av IChannelFactory för klientkanaler och IChannelListener för tjänstkanaler.

Dessa klasser tar en inre fabrik och lyssnare och delegerar alla utom OnCreateChannel och OnAcceptChannel anrop till den inre fabriken och lyssnaren.

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

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

Lägga till ett bindningselement

Exemplet definierar ett anpassat bindningselement: InterceptingBindingElement. InterceptingBindingElement tar en ChannelMessageInterceptor som indata och använder detta ChannelMessageInterceptor för att manipulera meddelanden som passerar genom den. Det här är den enda klassen som måste vara offentlig. Fabriken, lyssnaren och kanalerna kan alla vara interna implementeringar av de offentliga körningsgränssnitten.

public class InterceptingBindingElement : BindingElement
{
}

Lägga till konfigurationsstöd

För att integrera med bindningskonfiguration definierar biblioteket en konfigurationsavsnittshanterare som ett avsnitt för bindningselementtillägg. Klient- och serverkonfigurationsfilerna måste registrera bindningselementtillägget med konfigurationssystemet. Implementerare som vill exponera sitt bindningselement för konfigurationssystemet kan härledas från den här klassen.

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

Lägga till princip

För att integrera med vårt principsystem InterceptingBindingElement implementerar IPolicyExportExtension för att signalera att vi bör delta i genereringsprincipen. För att stödja importprincip på en genererad klient kan användaren registrera en härledd klass av InterceptingBindingElementImporter och åsidosätta CreateMessageInterceptor() för att generera sin principaktiverade ChannelMessageInterceptor klass.

Exempel: Droppable Message Inspector

I exemplet ingår en exempelimplementering där ChannelMessageInspector meddelanden tas bort.

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

Du kan komma åt den från konfigurationen på följande sätt:

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

Både klienten och servern använder det här nyligen skapade konfigurationsavsnittet för att infoga de anpassade fabrikerna i den lägsta nivån av deras körningskanalstackar (över transportnivån).

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

Klienten använder MessageInterceptor biblioteket för att lägga till en anpassad rubrik till även numrerade meddelanden. Tjänsten använder MessageInterceptor å andra sidan biblioteket för att släppa meddelanden som inte har den här specialrubriken.

Du bör se följande klientutdata när du har kört tjänsten och sedan klienten.

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

Klienten rapporterar 10 olika vindhastigheter till tjänsten, men taggar bara hälften av dem med den speciella rubriken.

I tjänsten bör du se följande utdata:

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.

Så här konfigurerar du, skapar och kör exemplet

  1. Installera ASP.NET 4.0 med hjälp av följande kommando.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  3. Skapa lösningen genom att följa anvisningarna i Skapa Windows Communication Foundation-exempel.

  4. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.

  5. Kör Service.exe först och kör sedan Client.exe och titta på båda konsolfönstren för utdata.