Sdílet prostřednictvím


Vlastní filtr zpráv

Ukázka MessageFilter ukazuje, jak nahradit filtry zpráv, které Windows Communication Foundation (WCF) používá k odesílání zpráv do koncových bodů.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Když první zpráva v kanálu přijde na server, musí server určit, které (pokud nějaké) koncové body přidružené k danému identifikátoru URI by měly zprávu obdržet. Tento proces je řízen MessageFilter objekty připojenými k objektu EndpointDispatcher.

Každý koncový bod služby má jeden EndpointDispatcher. Má EndpointDispatcher jak an, AddressFilter tak i ContractFilter. Sjednocení těchto dvou filtrů je filtr zpráv použitý pro tento koncový bod.

Ve výchozím nastavení AddressFilter odpovídá koncovému bodu pro koncový bod jakákoli zpráva adresovaná adrese, která odpovídá koncovému bodu EndpointAddressslužby . Ve výchozím nastavení ContractFilter koncový bod zkontroluje akci příchozí zprávy a odpovídá jakékoli zprávě s akcí, která odpovídá jedné z akcí operací kontraktu koncového bodu služby (zvažují se pouze IsInitiating=true akce). Ve výchozím nastavení se filtr koncového bodu shoduje jenom v případě, že záhlaví zprávy To je EndpointAddress koncový bod a akce zprávy odpovídá jedné z akcí operace koncového bodu.

Tyto filtry je možné změnit pomocí chování. V ukázce vytvoří služba nahrazení IEndpointBehavior a AddressFilterContractFilter na EndpointDispatcher:

class FilteringEndpointBehavior : IEndpointBehavior
{
    //...
}

Jsou definovány dva filtry adres:

// 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 { }

Tato FilteringEndpointBehavior možnost je konfigurovatelná a umožňuje dvě různé varianty.

public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement { }

Varianta 1 odpovídá pouze adresm, které obsahují "e" (ale mají jakoukoli akci), zatímco varianta 2 odpovídá pouze adresm, které nemají "e":

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

V konfiguračním souboru služba zaregistruje nové chování:

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

Pak služba vytvoří endpointBehavior konfigurace pro každou variantu:

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

Koncový bod služby nakonec odkazuje na jednu z těchto možností behaviorConfigurations:

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

Implementace klientské aplikace je jednoduchá; Vytvoří dva kanály identifikátoru URI služby (předáním této hodnoty jako druhéhovia () parametru CreateChannel(EndpointAddress) do a odeslání jedné zprávy v každém kanálu, ale pro každý z nich používá jiné adresy koncových bodů. V důsledku toho mají odchozí zprávy z klienta jiné označení a server odpovídajícím způsobem reaguje, jak ukazuje výstup klienta:

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

Přepnutí varianty v konfiguračním souboru serveru způsobí, že se filtr prohodí a klient uvidí opačné chování (zpráva bude urn:e úspěšná, zatímco zpráva selže urn:a ).

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

Nastavení, sestavení a spuštění ukázky

  1. Pokud chcete sestavit řešení, postupujte podle pokynů v části Sestavení ukázek Windows Communication Foundation.

  2. Pokud chcete spustit ukázku v konfiguraci s jedním počítačem, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci mezi počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation a v Client.cs změňte následující řádek.

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

    Nahraďte localhost názvem serveru.

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