Megosztás:


Egyéni üzenetszűrő

A MessageFilter-minta bemutatja, hogyan cserélheti le a Windows Communication Foundation (WCF) által a végpontokra küldött üzenetek küldéséhez használt üzenetszűrőket.

Megjegyzés:

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

Amikor egy csatornán az első üzenet megérkezik a kiszolgálóra, a kiszolgálónak meg kell határoznia, hogy az URI-hoz társított végpontok közül melyik (ha van ilyen) kapja meg az üzenetet. Ezt a folyamatot a MessageFilter hozzá csatolt EndpointDispatcherobjektumok vezérlik.

A szolgáltatás minden végpontja egyetlen EndpointDispatcher. A EndpointDispatcher rendelkezik egy AddressFilter-el és egy ContractFilter-el is. A két szűrő egysége az adott végponthoz használt üzenetszűrő.

Alapértelmezés szerint a AddressFilter végpont minden olyan üzenetnek megfelel, amelyet a szolgáltatásvégpont EndpointAddresscímére címeznek. Alapértelmezés szerint a ContractFilter végpont megvizsgálja a bejövő üzenet műveletét, és összeveti minden üzenettel, amelynek művelete megfelel a szolgáltatás végponti szerződésének műveletei közül egynek (csak a IsInitiating=true műveletek számítanak). Ennek eredményeképpen alapértelmezés szerint a végpont szűrője csak akkor egyezik meg, ha az üzenet Címzett fejléce a végpont EndpointAddress-ja, és az üzenet művelete megegyezik a végpont egyik műveletének akciójával.

Ezek a szűrők viselkedéssel módosíthatók. A mintában a szolgáltatás létrehoz egy IEndpointBehavior-t, amely felváltja a AddressFilter-et és ContractFilter-t a EndpointDispatcher-on.

class FilteringEndpointBehavior : IEndpointBehavior
{
    //...
}

Két címszűrő van definiálva:

// Matches any message whose To address contains the letter 'e'
class MatchEAddressFilter : MessageFilter { }
// Matches any message whose To address does not contain the letter 'e'
class MatchNoEAddressFilter : MessageFilter { }

Ez FilteringEndpointBehavior konfigurálható, és két különböző változatot tesz lehetővé.

public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement { }

Az 1. változat csak olyan címeket egyezik meg, amelyek "e"-t tartalmaznak (de bármilyen műveletük van), míg a 2. változat csak azokat a címeket egyezik meg, amelyek nem rendelkeznek "e"-sel:

if (Variation == 1)
    return new FilteringEndpointBehavior(
        new MatchEAddressFilter(), new MatchAllMessageFilter());
else
    return new FilteringEndpointBehavior(
        new MatchNoEAddressFilter(), new MatchAllMessageFilter());

A konfigurációs fájlban a szolgáltatás regisztrálja az új viselkedést:

<extensions>
    <behaviorExtensions>
        <add name="filteringEndpointBehavior" type="Microsoft.ServiceModel.Samples.FilteringEndpointBehaviorExtension, service" />
    </behaviorExtensions>
</extensions>

Ezután a szolgáltatás konfigurációkat hoz létre endpointBehavior az egyes változatokhoz:

<endpointBehaviors>
    <behavior name="endpoint1">
        <filteringEndpointBehavior variation="1" />
    </behavior>
    <behavior name="endpoint2">
        <filteringEndpointBehavior variation="2" />
    </behavior>
</endpointBehaviors>

Végül a szolgáltatás végpontja a behaviorConfigurationskövetkező egyikre hivatkozik:

<endpoint address=""
        bindingConfiguration="ws"
        listenUri=""
        binding="wsHttpBinding"
        contract="Microsoft.ServiceModel.Samples.IHello"
        behaviorConfiguration="endpoint2" />

Az ügyfélalkalmazás megvalósítása egyszerű; két csatornát hoz létre a szolgáltatás URI-jának (ha ezt az értéket a második (via) paraméterként CreateChannel(EndpointAddress) adja át, és minden csatornán egyetlen üzenetet küld, de mindegyikhez különböző végpontcímeket használ. Ennek eredményeképpen az ügyfél kimenő üzenetei eltérő To-megjelölésekkel rendelkeznek, és a kiszolgáló ennek megfelelően válaszol, ahogy azt az ügyfél kimenete is mutatja:

Sending message to urn:e...
Exception: The message with To 'urn:e' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.

Sending message to urn:a...
Hello

A kiszolgáló konfigurációs fájljának változatának váltásával a szűrő felcserélődik, és az ügyfél az ellenkező viselkedést látja (az üzenet urn:e sikeres lesz, míg az üzenet urn:a sikertelen lesz).

<endpoint address=""
          bindingConfiguration="ws"
          listenUri=""
          binding="wsHttpBinding"
          contract="Microsoft.ServiceModel.Samples.IHello"
          behaviorConfiguration="endpoint1" />

A példa beállítása, elkészítése és futtatása

  1. A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.

  2. Ha a mintát egy gépes konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.

  3. Ha gépközi konfigurációban szeretné futtatni a mintát, kövesse a Windows Communication Foundation-minták futtatására vonatkozó utasításokat, és módosítsa a következő sort a Client.cs.

    Uri serviceVia = new Uri("http://localhost/ServiceModelSamples/service.svc");
    

    Cserélje le a localhostot a kiszolgáló nevére.

    Uri serviceVia = new Uri("http://servermachinename/ServiceModelSamples/service.svc");