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.
MessageInterceptor örneği, kanal genişletilebilirlik modelinin kullanımını gösterir. Özellikle, çalışma zamanı yığınının belirli bir noktasında tüm gelen ve giden iletileri kesmek için kanal fabrikaları ve kanal dinleyicileri oluşturan özel bir bağlama öğesinin nasıl uygulandığını gösterir. Örnek ayrıca bu özel fabrikaların kullanımını gösteren bir istemci ve sunucu içerir.
Bu örnekte hem istemci hem de hizmet konsol programlarıdır (.exe). hem istemci hem de hizmet, özel bağlama öğesini ve ilişkili çalışma zamanı nesnelerini içeren ortak bir kitaplık (.dll) kullanır.
Uyarı
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Örnek, kanal çerçevesini kullanarak ve WCF en iyi yöntemlerini izleyerek Windows Communication Foundation'da (WCF) özel katmanlı kanal oluşturmak için önerilen yordamı açıklar. Özel katmanlı kanal oluşturma adımları aşağıdaki gibidir:
Kanal fabrikanızın ve kanal dinleyicinizin hangi kanal şekillerini destekleyeceğine karar verin.
Kanal şekillerinizi destekleyen bir kanal fabrikası ve kanal dinleyicisi oluşturun.
Özel katmanlı kanalı bir kanal yığınına ekleyen bir bağlama öğesi ekleyin.
Yeni bağlama öğesini yapılandırma sisteminde kullanıma açmak için bir bağlama öğesi uzantısı bölümü ekleyin.
Kanal Şekilleri
Özel katmanlı kanal yazmanın ilk adımı, kanal için hangi şekillerin gerekli olduğuna karar vermektir. İleti denetçimiz için, altımızdaki katmanın desteklediği herhangi bir şekli destekliyoruz (örneğin, altımızdaki katman IOutputChannel ve IDuplexSessionChannel oluşturabiliyorsa, biz de IOutputChannel ve IDuplexSessionChannel'ü kullanıma sunarız).
Kanal Fabrikası ve Dinleyici Fabrikası
Özel katmanlı kanal yazmanın bir sonraki adımı, IChannelFactory istemci kanalları ve IChannelListener hizmet kanalları için uygulamasını oluşturmaktır.
Bu sınıflar bir iç fabrikayı ve dinleyiciyi alır ve OnCreateChannel ve OnAcceptChannel çağrıları dışında tüm çağrılarını iç fabrikaya ve dinleyiciye vekâlet eder.
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
//...
}
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
//...
}
Bağlama Öğesi Ekleme
Örnek, özel bir bağlama öğesi tanımlar: InterceptingBindingElement.
InterceptingBindingElement giriş olarak bir ChannelMessageInterceptor alır ve bunu ChannelMessageInterceptor , içinden geçen iletileri işlemek için kullanır. Bu, genel olması gereken tek sınıftır. Fabrika, dinleyici ve kanalların tümü genel çalışma zamanı arabirimlerinin iç uygulamaları olabilir.
public class InterceptingBindingElement : BindingElement
{
}
Yapılandırma Desteği Ekleme
Bağlama yapılandırmasıyla tümleştirmek için kitaplık, yapılandırma bölümü işleyicisini bağlama öğesi uzantısı bölümü olarak tanımlar. İstemci ve sunucu yapılandırma dosyalarının bağlama öğesi uzantısını yapılandırma sistemine kaydetmesi gerekir. Bağlama öğelerini yapılandırma sistemine göstermek isteyen uygulayıcılar bu sınıftan türetilebilir.
public abstract class InterceptingElement : BindingElementExtensionElement
{
//...
}
Politika Ekleme
İlke sistemimizle tümleştirmek için IPolicyExportExtension'ı InterceptingBindingElement uygulayarak ilke oluşturmaya katılmamız gerektiğini bildirir. Oluşturulan bir istemcide politikanın içeri aktarılmasını desteklemek için, kullanıcı türetilmiş bir InterceptingBindingElementImporter sınıfını kaydedebilir ve politika destekli CreateMessageInterceptor sınıfını oluşturmak için ChannelMessageInterceptor() yöntemini geçersiz kılabilir.
Örnek: Bırakılabilir İleti Denetçisi
Örnekte, iletileri bırakan bir ChannelMessageInspector örnek uygulama yer alır.
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
Yapılandırmadan aşağıdaki gibi erişebilirsiniz:
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
İstemci ve sunucu, özel fabrikaları çalışma zamanı kanal yığınlarının en alt seviyesine (aktarım düzeyinin üzerinde) eklemek için yeni oluşturulan bu yapılandırma bölümünü kullanır.
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
İstemci, çift numaralı iletilere özel üst bilgi eklemek için MessageInterceptor kütüphanesini kullanır. Öte yandan hizmet, bu özel üst bilgisine sahip olmayan iletileri atmak için MessageInterceptor kitaplığını kullanır.
Hizmeti ve ardından istemciyi çalıştırdıktan sonra aşağıdaki istemci çıkışını görmeniz gerekir.
Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client
İstemci hizmete 10 farklı rüzgar hızı bildirir, ancak bunların yalnızca yarısını özel üst bilgiyle etiketler.
Hizmette aşağıdaki çıkışı görmeniz gerekir:
Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.
Örneği ayarlamak, derlemek ve çalıştırmak için
Aşağıdaki komutu kullanarak ASP.NET 4.0'ı yükleyin.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enableWindows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.
Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.
önce Service.exe çalıştırın, ardından Client.exe çalıştırın ve her iki konsol penceresini de çıkış için izleyin.