Aracılığıyla paylaş


Özel İleti Filtresi

MessageFilter örneği, Windows Communication Foundation'ın (WCF) uç noktalara ileti göndermek için kullandığı ileti filtrelerinin nasıl değiştirildiğini gösterir.

Not

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Kanaldaki ilk ileti sunucuya ulaştığında, sunucunun bu URI ile ilişkili uç noktalardan hangilerinin (varsa) iletiyi alması gerektiğini belirlemesi gerekir. Bu işlem, öğesine bağlı nesneler tarafından MessageFilter denetlenilir EndpointDispatcher.

Bir hizmetin her uç noktasının tek EndpointDispatcherbir uç noktası vardır. hem EndpointDispatcher hem AddressFilter de öğesine ContractFiltersahiptir. Bu iki filtrenin birleşimi, bu uç nokta için kullanılan ileti filtresidir.

Varsayılan olarak, AddressFilter uç nokta için değeri, hizmet uç noktasının EndpointAddressadresiyle eşleşen bir adresle adreslenen tüm iletiyle eşleşir. Varsayılan olarak, ContractFilter uç nokta için gelen iletinin eylemini inceler ve herhangi bir iletiyi hizmet uç noktası sözleşmesinin işlemlerinden birine karşılık gelen bir eylemle eşleştirir (yalnızca IsInitiating=true eylemler dikkate alınır). Sonuç olarak, varsayılan olarak, uç nokta filtresi yalnızca iletinin Bitiş üst bilgisi uç noktanın üst bilgisiyse EndpointAddress ve iletinin eylemi uç nokta işleminin eylemlerinden biriyle eşleşiyorsa eşleşir.

Bu filtreler bir davranış kullanılarak değiştirilebilir. Örnekte, hizmet üzerinde EndpointDispatcherve ContractFilter öğesinin yerini AddressFilter alan bir IEndpointBehavior oluşturur:

class FilteringEndpointBehavior : IEndpointBehavior
{
    //...
}

İki adres filtresi tanımlanır:

// 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 yapılandırılabilir hale gelir ve iki farklı varyasyona izin verir.

public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement { }

Çeşitleme 1 yalnızca 'e' içeren adreslerle (ancak herhangi bir Eylem içeren adreslerle) eşleşirken Çeşitleme 2 yalnızca 'e' içermeyen adreslerle eşleşir:

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

Yapılandırma dosyasında, hizmet yeni davranışı kaydeder:

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

Ardından hizmet, her çeşitleme için yapılandırmalar oluşturur endpointBehavior :

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

Son olarak, hizmetin uç noktası aşağıdakilerden birine başvurur behaviorConfigurations:

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

İstemci uygulamasının uygulanması basittir; hizmetin URI'sine iki kanal oluşturur (bu değeri ikinci (via) parametre CreateChannel(EndpointAddress) olarak geçirerek ve her kanalda tek bir ileti gönderir, ancak her biri için farklı uç nokta adresleri kullanır. Sonuç olarak, istemciden gelen giden iletilerin Farklı To atamaları vardır ve sunucu istemcinin çıkışında gösterildiği gibi buna göre yanıt verir:

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

Sunucunun yapılandırma dosyasındaki varyasyonu değiştirmek, filtrenin değiştirilmesine neden olur ve istemci karşıt davranışı görür (ileti başarılı olurken urn:eurn:a ileti başarısız olur).

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

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  2. Örneği tek makineli bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.

  3. Örneği makineler arası yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin ve Client.cs'da aşağıdaki satırı değiştirin.

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

    localhost değerini sunucu adıyla değiştirin.

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