Aracılığıyla paylaş


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:

  1. 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.

  2. WSE TCP hizmetine bağlanan ve istemciler IDuplexSessionChannelüzerinden çerçeveli iletiler gönderen bir kanal fabrikası oluşturun.

  3. Gelen TCP bağlantılarını kabul etmek ve ilgili kanalları oluşturmak için bir kanal dinleyicisi oluşturun.

  4. Ağa özgü özel durumların uygun türetilmiş sınıfına normalleştirildiğinden CommunicationExceptionemin olun.

  5. Ö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.

  • WseTcpChannelFactoryIDuplexSessionChannel'den ChannelFactoryBase<>türetilir. İstemci kanalları üretmek için geçersiz kılan OnCreateChannel bir fabrikadır.

protected override IDuplexSessionChannel OnCreateChannel(EndpointAddress remoteAddress, Uri via)

{

return new ClientWseTcpDuplexSessionChannel(encoderFactory, bufferManager, remoteAddress, via, this);

}

  • ClientWseTcpDuplexSessionChannelbir TCP sunucusuna channel.Open bağlanmak için tabana WseTcpDuplexSessionChannel 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 SocketExceptionCommunicationExceptionsarmalanmış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.

  • WseTcpChannelListenerIDuplexSessionChannel'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 WseTcpTransportBindingElementTransportBindingElementtü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

  1. 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 .

  1. Örneği yükledikten TcpSyncStockService sonra aşağıdakileri yapın:

    1. 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.)

    2. StockService projesini başlangıç projesi olarak ayarlayın.

    3. 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.

    4. başlatmak için F5 tuşuna TcpSyncStockServicebasın. Hizmet yeni bir konsol penceresinde başlar.

    5. Bu TCP aktarım örneğini Visual Studio'da açın.

    6. TestCode.cs içindeki "hostname" değişkenini çalıştıran makine adıyla eşleşecek şekilde güncelleştirin TcpSyncStockService.

    7. TCP aktarım örneğini başlatmak için F5 tuşuna basın.

    8. 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.