Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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
A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.
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.
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");