Anpassat meddelandefilter
Exemplet MessageFilter visar hur du ersätter de meddelandefilter som Windows Communication Foundation (WCF) använder för att skicka meddelanden till slutpunkter.
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
När det första meddelandet på en kanal kommer till servern måste servern avgöra vilka (om några) slutpunkter som är associerade med den URI:n ska ta emot meddelandet. Den här processen styrs av de objekt som MessageFilter är kopplade till EndpointDispatcher.
Varje slutpunkt för en tjänst har en enda EndpointDispatcher. EndpointDispatcher Har både en AddressFilter och en ContractFilter. Union av dessa två filter är det meddelandefilter som används för slutpunkten.
Som standard AddressFilter matchar för en slutpunkt alla meddelanden som är adresserade till en adress som matchar tjänstslutpunktens EndpointAddress. Som standard ContractFilter kontrollerar för en slutpunkt åtgärden för det inkommande meddelandet och matchar alla meddelanden med en åtgärd som motsvarar en av åtgärderna i tjänstslutpunktskontraktets åtgärder (endast IsInitiating
=true
åtgärder beaktas). Därför matchar filtret för en slutpunkt som standard endast om både meddelandets Till-huvud är EndpointAddress slutpunktens och meddelandets åtgärd matchar en av slutpunktsåtgärdens åtgärder.
Dessa filter kan ändras med hjälp av ett beteende. I exemplet skapar tjänsten en IEndpointBehavior som ersätter AddressFilter och ContractFilter på EndpointDispatcher:
class FilteringEndpointBehavior : IEndpointBehavior
{
//...
}
Två adressfilter definieras:
// 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 { }
FilteringEndpointBehavior
Görs konfigurerbar och möjliggör två olika varianter.
public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement { }
Variant 1 matchar endast adresser som innehåller ett "e" (men som har någon åtgärd) medan variant 2 endast matchar adresser som saknar ett "e":
if (Variation == 1)
return new FilteringEndpointBehavior(
new MatchEAddressFilter(), new MatchAllMessageFilter());
else
return new FilteringEndpointBehavior(
new MatchNoEAddressFilter(), new MatchAllMessageFilter());
I konfigurationsfilen registrerar tjänsten det nya beteendet:
<extensions>
<behaviorExtensions>
<add name="filteringEndpointBehavior" type="Microsoft.ServiceModel.Samples.FilteringEndpointBehaviorExtension, service" />
</behaviorExtensions>
</extensions>
Sedan skapar endpointBehavior
tjänsten konfigurationer för varje variant:
<endpointBehaviors>
<behavior name="endpoint1">
<filteringEndpointBehavior variation="1" />
</behavior>
<behavior name="endpoint2">
<filteringEndpointBehavior variation="2" />
</behavior>
</endpointBehaviors>
Slutligen refererar tjänstens slutpunkt till en av :behaviorConfigurations
<endpoint address=""
bindingConfiguration="ws"
listenUri=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IHello"
behaviorConfiguration="endpoint2" />
Implementeringen av klientprogrammet är enkel. den skapar två kanaler till tjänstens URI (genom att skicka det värdet som den andra parametern (via
) till CreateChannel(EndpointAddress) och skickar ett enda meddelande på varje kanal, men den använder olika slutpunktsadresser för var och en. Därför har utgående meddelanden från klienten olika Till-beteckningar, och servern svarar därefter, vilket visas av klientens utdata:
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
Om du byter variant i serverns konfigurationsfil växlas filtret och klienten ser det motsatta beteendet (meddelandet urn:e
lyckas, medan meddelandet urn:a
misslyckas).
<endpoint address=""
bindingConfiguration="ws"
listenUri=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IHello"
behaviorConfiguration="endpoint1" />
Så här konfigurerar du, skapar och kör exemplet
Skapa lösningen genom att följa anvisningarna i Skapa Windows Communication Foundation-exempel.
Om du vill köra exemplet i en konfiguration med en enda dator följer du anvisningarna i Köra Windows Communication Foundation-exempel.
Om du vill köra exemplet i en konfiguration mellan datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel och ändrar följande rad i Client.cs.
Uri serviceVia = new Uri("http://localhost/ServiceModelSamples/service.svc");
Ersätt localhost med namnet på servern.
Uri serviceVia = new Uri("http://servermachinename/ServiceModelSamples/service.svc");