Aangepast berichtfilter
Het MessageFilter-voorbeeld laat zien hoe u de berichtfilters vervangt die door Windows Communication Foundation (WCF) worden gebruikt om berichten naar eindpunten te verzenden.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
Wanneer het eerste bericht op een kanaal op de server aankomt, moet de server bepalen welke (indien van toepassing) eindpunten die aan die URI zijn gekoppeld, het bericht moeten ontvangen. Dit proces wordt bepaald door de MessageFilter objecten die zijn gekoppeld aan de EndpointDispatcher.
Elk eindpunt van een service heeft één EndpointDispatcher. De EndpointDispatcher heeft zowel een als AddressFilter een ContractFilter. De samenvoeging van deze twee filters is het berichtfilter dat voor dat eindpunt wordt gebruikt.
Standaard komt het AddressFilter voor een eindpunt overeen met elk bericht dat is geadresseerd aan een adres dat overeenkomt met het service-eindpunt EndpointAddress. Standaard inspecteert het ContractFilter voor een eindpunt de actie van het binnenkomende bericht en komt overeen met een bericht met een actie die overeenkomt met een van de acties van de bewerkingen van het service-eindpuntcontract (alleen IsInitiating
=true
acties worden overwogen). Als gevolg hiervan komt het filter voor een eindpunt standaard alleen overeen als zowel de aan-header van het bericht het EndpointAddress eindpunt is als de actie van het bericht overeenkomt met een van de acties van de eindpuntbewerking.
Deze filters kunnen worden gewijzigd met behulp van een gedrag. In het voorbeeld maakt de service een IEndpointBehavior service die de en ContractFilter op het AddressFilterEndpointDispatchervolgende vervangt:
class FilteringEndpointBehavior : IEndpointBehavior
{
//...
}
Er worden twee adresfilters gedefinieerd:
// 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 { }
Het FilteringEndpointBehavior
is configureerbaar en maakt twee verschillende variaties mogelijk.
public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement { }
Variatie 1 komt overeen met alleen adressen die een e bevatten (maar die een actie hebben), terwijl variatie 2 alleen overeenkomt met adressen die geen e hebben:
if (Variation == 1)
return new FilteringEndpointBehavior(
new MatchEAddressFilter(), new MatchAllMessageFilter());
else
return new FilteringEndpointBehavior(
new MatchNoEAddressFilter(), new MatchAllMessageFilter());
In het configuratiebestand registreert de service het nieuwe gedrag:
<extensions>
<behaviorExtensions>
<add name="filteringEndpointBehavior" type="Microsoft.ServiceModel.Samples.FilteringEndpointBehaviorExtension, service" />
</behaviorExtensions>
</extensions>
Vervolgens maakt endpointBehavior
de service configuraties voor elke variatie:
<endpointBehaviors>
<behavior name="endpoint1">
<filteringEndpointBehavior variation="1" />
</behavior>
<behavior name="endpoint2">
<filteringEndpointBehavior variation="2" />
</behavior>
</endpointBehaviors>
Ten slotte verwijst het eindpunt van de service naar een van de behaviorConfigurations
volgende:
<endpoint address=""
bindingConfiguration="ws"
listenUri=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IHello"
behaviorConfiguration="endpoint2" />
De implementatie van de clienttoepassing is eenvoudig; er worden twee kanalen gemaakt naar de URI van de service (door die waarde door te geven als de tweede (via
) parameter en CreateChannel(EndpointAddress) verzendt één bericht op elk kanaal, maar er worden verschillende eindpuntadressen voor elk kanaal gebruikt. Als gevolg hiervan hebben de uitgaande berichten van de client verschillende Aan-aanduidingen en reageert de server dienovereenkomstig, zoals wordt aangetoond door de uitvoer van de client:
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
Als u de variatie in het configuratiebestand van de server wijzigt, wordt het filter verwisseld en ziet de client het tegenovergestelde gedrag (het bericht urn:e
slaagt, terwijl het bericht mislukt urn:a
).
<endpoint address=""
bindingConfiguration="ws"
listenUri=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IHello"
behaviorConfiguration="endpoint1" />
Volg de instructies in Het bouwen van de Windows Communication Foundation-voorbeelden om de oplossing te bouwen.
Als u het voorbeeld wilt uitvoeren in een configuratie met één computer, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.
Als u het voorbeeld wilt uitvoeren in een configuratie voor meerdere computers, volgt u de instructies bij het uitvoeren van de Windows Communication Foundation-voorbeelden en wijzigt u de volgende regel in Client.cs.
Uri serviceVia = new Uri("http://localhost/ServiceModelSamples/service.svc");
Vervang localhost door de naam van de server.
Uri serviceVia = new Uri("http://servermachinename/ServiceModelSamples/service.svc");