Taşıma: WSE 3.0 TCP Birlikte Çalışabilirlik
WSE 3.0 TCP Birlikte Çalışabilirlik Aktarımı örneği, tcp çift yönlü oturumun özel bir Windows Communication Foundation (WCF) aktarımı olarak nasıl uygulandığını gösterir. Ayrıca, mevcut dağıtılmış sistemlerle kablo üzerinde arabirim yapmak için kanal katmanının genişletilebilirliğini nasıl kullanabileceğinizi gösterir. Aşağıdaki adımlarda bu özel WCF aktarımının nasıl derlenmiyor olduğu gösterilmektedir:
TCP yuvasından başlayarak, ileti sınırlarının çizgisini çizmek için DIME Çerçeveleme kullanan istemci ve sunucu uygulamaları IDuplexSessionChannel oluşturun.
WSE TCP hizmetine bağlanan ve istemciler IDuplexSessionChannelüzerinden çerçeveli iletiler gönderen bir kanal fabrikası oluşturun.
Gelen TCP bağlantılarını kabul etmek ve ilgili kanalları oluşturmak için bir kanal dinleyicisi oluşturun.
Ağa özgü özel durumların uygun türetilmiş sınıfına normalleştirildiğinden CommunicationExceptionemin olun.
Özel aktarımı bir kanal yığınına ekleyen bir bağlama öğesi ekleyin. Daha fazla bilgi için bkz. [Bağlama Öğesi Ekleme].
IDuplexSessionChannel Oluşturma
WSE 3.0 TCP Birlikte Çalışabilirlik Aktarımı'nı yazmanın ilk adımı, üzerinde bir Socketuygulaması IDuplexSessionChannel oluşturmaktır. WseTcpDuplexSessionChannel
' den ChannelBasetüretilir. İleti gönderme mantığı iki ana parçadan oluşur: (1) İletiyi bayt olarak kodlama ve (2) bu baytları çerçeveleme ve tel üzerinde gönderme.
ArraySegment<byte> encodedBytes = EncodeMessage(message);
WriteData(encodedBytes);
Ayrıca Send() çağrılarının IDuplexSessionChannel sıralı garantisini koruması ve temel yuvaya yapılan çağrıların doğru şekilde eşitlenmesi için bir kilit alınır.
WseTcpDuplexSessionChannel
, bayt MessageEncoder [] olarak ve bayttan çevirmek için a Message kullanır. Bu bir aktarım olduğundan, WseTcpDuplexSessionChannel
kanalın yapılandırıldığı uzak adresin uygulanmasından da sorumludur. EncodeMessage
bu dönüştürmenin mantığını kapsüller.
this.RemoteAddress.ApplyTo(message);
return encoder.WriteMessage(message, maxBufferSize, bufferManager);
Message bayt olarak kodlandıktan sonra, kabloya iletilmelidir. Bu, ileti sınırlarını tanımlamak için bir sistem gerektirir. WSE 3.0, çerçeve protokolü olarak DIME sürümünü kullanır. WriteData
bir bayt[] öğesini dime kayıtları kümesine sarmak için çerçeveleme mantığını kapsüller.
İleti alma mantığı benzerdir. Ana karmaşıklık, yuva okumasının istenenden daha az bayt döndürebileceği gerçeğini işlemektir. İleti almak için, WseTcpDuplexSessionChannel
kablodaki baytları okur, DIME çerçevesini çözer ve bayt[] değerini bir Messageiçine dönüştürmek için kullanırMessageEncoder.
Taban WseTcpDuplexSessionChannel
, bağlı bir yuva aldığını varsayar. Temel sınıf yuva kapatmayı işler. Yuva kapatma ile arabirim oluşturan üç yer vardır:
OnAbort -- yuvayı düzgün bir şekilde kapatın (sabit yakın).
Açık[Başlangıç]Kapat -- yuvayı düzgün bir şekilde kapatın (yumuşak kapanış).
Oturum. CloseOutputSession -- giden veri akışını kapatın (yarı yakın).
Kanal Fabrikası
TCP aktarımını yazmanın bir sonraki adımı, istemci kanalları için uygulamasını IChannelFactory oluşturmaktır.
WseTcpChannelFactory
IDuplexSessionChannel'den ChannelFactoryBase<>türetilir. İstemci kanalları üretmek için geçersiz kılanOnCreateChannel
bir fabrikadır.
protected override IDuplexSessionChannel OnCreateChannel(EndpointAddress remoteAddress, Uri via)
{
return new ClientWseTcpDuplexSessionChannel(encoderFactory, bufferManager, remoteAddress, via, this);
}
ClientWseTcpDuplexSessionChannel
bir TCP sunucusunachannel.Open
bağlanmak için tabanaWseTcpDuplexSessionChannel
mantık ekler. İlk olarak ana bilgisayar adı, aşağıdaki kodda gösterildiği gibi bir IP adresine çözümlenir.
hostEntry = Dns.GetHostEntry(Via.Host);
- Ardından konak adı, aşağıdaki kodda gösterildiği gibi döngüdeki ilk kullanılabilir IP adresine bağlanır.
IPAddress address = hostEntry.AddressList[i];
socket = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(address, port));
- Kanal sözleşmesinin bir parçası olarak, etki alanına özgü özel durumlar içinde gibi
SocketException
CommunicationExceptionsarmalanmıştır.
Kanal Dinleyicisi
TCP aktarımını yazmanın bir sonraki adımı, sunucu kanallarını kabul etmek için uygulamasını IChannelListener oluşturmaktır.
WseTcpChannelListener
IDuplexSessionChannel'den ChannelListenerBase<> türetilir ve dinleme yuvasının ömrünü denetlemek için Açık[Başlangıç]Aç ve Aç[Başla]Kapat'ı geçersiz kılar. OnOpen'da, IP_ANY dinlemek için bir yuva oluşturulur. Daha gelişmiş uygulamalar, IPv6'da dinlemek için ikinci bir yuva da oluşturabilir. Ayrıca, ana bilgisayar adında IP adresinin belirtilmesine de izin verebilirler.
IPEndPoint localEndpoint = new IPEndPoint(IPAddress.Any, uri.Port);
this.listenSocket = new Socket(localEndpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
this.listenSocket.Bind(localEndpoint);
this.listenSocket.Listen(10);
Yeni bir yuva kabul edildiğinde, bu yuva ile bir sunucu kanalı başlatılır. Tüm giriş ve çıkışlar temel sınıfta zaten uygulanır, bu nedenle yuvayı başlatmak bu kanaldan sorumludur.
Bağlama Öğesi Ekleme
Artık fabrikalar ve kanallar derlendiklerine göre, bağlama aracılığıyla ServiceModel çalışma zamanına sunulmaları gerekir. Bağlama, bir hizmet adresiyle ilişkili iletişim yığınını temsil eden bağlama öğeleri koleksiyonudur. Yığındaki her öğe bir bağlama öğesiyle temsil edilir.
Örnekte bağlama öğesi öğesinden WseTcpTransportBindingElement
TransportBindingElementtüretilir. Bağlamamızla ilişkili fabrikaları oluşturmak için aşağıdaki yöntemleri destekler IDuplexSessionChannel ve geçersiz kılar.
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new WseTcpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new WseTcpChannelListener(this, context);
}
Ayrıca, öğesini kopyalama BindingElement
ve şemamızı döndürme (wse.tcp) için de üyeler içerir.
WSE TCP Test Konsolu
Bu örnek taşımayı kullanmak için test kodu TestCode.cs'de kullanılabilir. Aşağıdaki yönergelerde WSE TcpSyncStockService
örneğinin nasıl ayarlanacağı gösterilmektedir.
Test kodu, kodlama ve WseTcpTransport
aktarım olarak MTOM kullanan özel bir bağlama oluşturur. Ayrıca aşağıdaki kodda gösterildiği gibi AddressingVersion'ı WSE 3.0 ile uyumlu olacak şekilde ayarlar.
CustomBinding binding = new CustomBinding();
MtomMessageEncodingBindingElement mtomBindingElement = new MtomMessageEncodingBindingElement();
mtomBindingElement.MessageVersion = MessageVersion.Soap11WSAddressingAugust2004;
binding.Elements.Add(mtomBindingElement);
binding.Elements.Add(new WseTcpTransportBindingElement());
İki testten oluşur: bir test, WSE 3.0 WSDL'den oluşturulan kodu kullanarak türlenmiş bir istemci ayarlar. İkinci test, doğrudan kanal API'lerinin üzerine ileti göndererek wcf'yi hem istemci hem de sunucu olarak kullanır.
Örnek çalıştırılırken aşağıdaki çıkış beklenir.
İstemci:
Calling soap://stockservice.contoso.com/wse/samples/2003/06/TcpSyncStockService
Symbol: FABRIKAM
Name: Fabrikam, Inc.
Last Price: 120
Symbol: CONTOSO
Name: Contoso Corp.
Last Price: 50.07
Press enter.
Received Action: http://SayHello
Received Body: to you.
Hello to you.
Press enter.
Received Action: http://NotHello
Received Body: to me.
Press enter.
Sunucu:
Listening for messages at soap://stockservice.contoso.com/wse/samples/2003/06/TcpSyncStockService
Press any key to exit when done...
Request received.
Symbols:
FABRIKAM
CONTOSO
Örneği ayarlama, derleme ve çalıştırma
- Bu örneği çalıştırmak için Microsoft .NET için Web Hizmetleri Geliştirmeleri (WSE) 3.0 ve WSE
TcpSyncStockService
örneği yüklü olmalıdır.
Not
WSE 3.0, Windows Server 2008'de desteklenmediğinden, örneği bu işletim sistemine yükleyemez veya çalıştıramazsınız TcpSyncStockService
.
Örneği yükledikten
TcpSyncStockService
sonra aşağıdakileri yapın:TcpSyncStockService
dosyasını Visual Studio'da açın. (TcpSyncStockService örneği WSE 3.0 ile yüklenir. Bu örnek kodunun bir parçası değildir.)StockService projesini başlangıç projesi olarak ayarlayın.
StockService projesinde StockService.cs açın ve sınıfındaki [Policy] özniteliğini açıklama satırı yapın
StockService
. Bu, örnekteki güvenliği devre dışı bırakır. WCF, WSE 3.0 güvenli uç noktalarıyla birlikte çalışabilirken, bu örneği özel TCP aktarımına odaklanmak için güvenlik devre dışı bırakılır.başlatmak için F5 tuşuna
TcpSyncStockService
basın. Hizmet yeni bir konsol penceresinde başlar.Bu TCP aktarım örneğini Visual Studio'da açın.
TestCode.cs içindeki "hostname" değişkenini çalıştıran makine adıyla eşleşecek şekilde güncelleştirin
TcpSyncStockService
.TCP aktarım örneğini başlatmak için F5 tuşuna basın.
TCP aktarım testi istemcisi yeni bir konsolda başlar. İstemci hizmetten hisse senedi teklifleri talep eder ve ardından sonuçları konsol penceresinde görüntüler.