Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
Uyarı
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 süreç, MessageFilter nesnelerinin EndpointDispatcher'ye bağlanmış olması ile denetlenir.
Bir hizmetin her uç noktasının tek bir EndpointDispatcher vardır. EndpointDispatcher hem AddressFilter ve ContractFilter'ye sahiptir. Bu iki filtrenin birleşimi, bu uç nokta için kullanılan ileti filtresidir.
Varsayılan olarak, bir uç nokta için AddressFilter, hizmet uç noktasının EndpointAddress adresiyle eşleşen bir adrese gönderilen tüm iletilerle 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, bir uç nokta filtresi yalnızca iletinin 'To' başlığı EndpointAddress uç noktanın başlığıysa 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, IEndpointBehavior üzerinde AddressFilter ve ContractFilter öğelerinin yerini alan bir EndpointDispatcher 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ı 'Alıcı' atamaları vardır ve sunucu, istemcinin çıktısında gösterildiği gibi buna uygun olarak 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ştirilmesiyle sonuçlanır ve istemci, karşıt bir davranış görür (mesaj urn:e için başarılı olurken, urn:a için 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
Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.
Ö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.
Ö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");