Sdílet prostřednictvím


Přenos: Součinnost TCP ve WSE 3.0

Ukázka přenosu interoperability PROTOKOLU TCP WSE 3.0 ukazuje, jak implementovat duplexní relaci TCP jako vlastní přenos wcf (Windows Communication Foundation). Ukazuje také, jak můžete použít rozšiřitelnost vrstvy kanálu pro rozhraní přes drát s existujícími nasazenými systémy. Následující kroky ukazují, jak sestavit tento vlastní přenos WCF:

  1. Počínaje soketem TCP vytvořte implementace IDuplexSessionChannel klienta a serveru, které používají dime Framing k vymezení hranic zpráv.

  2. Vytvořte objekt pro vytváření kanálů, který se připojuje ke službě WSE TCP a odesílá zarámované zprávy přes klienty IDuplexSessionChannel.

  3. Vytvořte naslouchací proces kanálu pro příjem příchozích připojení TCP a vytvořte odpovídající kanály.

  4. Zajistěte, aby všechny výjimky specifické pro síť byly normalizovány do příslušné odvozené třídy CommunicationException.

  5. Přidejte element vazby, který přidá vlastní přenos do zásobníku kanálu. Další informace naleznete v tématu [Přidání elementu vazby].

Vytváření IDuplexSessionChannel

Prvním krokem při psaní protokolu WSE 3.0 TCP Interoperability Transport je vytvořit implementaci IDuplexSessionChannel nad .Socket WseTcpDuplexSessionChannel odvozuje od ChannelBase. Logika odeslání zprávy se skládá ze dvou hlavních částí: (1) Kódování zprávy na bajty a (2) rámování těchto bajtů a jejich odesílání na drát.

ArraySegment<byte> encodedBytes = EncodeMessage(message);

WriteData(encodedBytes);

Kromě toho se zamkne, aby volání Send() zachovala záruku IDuplexSessionChannel v pořadí a aby volání do podkladového soketu byla správně synchronizována.

WseTcpDuplexSessionChannelMessageEncoder používá k převodu bajtu Message do a z bajtu[]. Vzhledem k tomu, že se jedná o přenos, zodpovídá také za použití vzdálené adresy, WseTcpDuplexSessionChannel se kterou byl kanál nakonfigurován. EncodeMessage zapouzdřuje logiku pro tento převod.

this.RemoteAddress.ApplyTo(message);

return encoder.WriteMessage(message, maxBufferSize, bufferManager);

Jakmile je kódován Message do bajtů, musí být přenášen na drátu. To vyžaduje systém pro definování hranic zpráv. WSE 3.0 používá jako svůj protokol pro rámování verzi DIME . WriteData zapouzdřuje logiku rámování pro zabalení bajtu[] do sady záznamů DIME.

Logika příjmu zpráv je podobná. Hlavní složitost je zpracování skutečnosti, že čtení soketu může vrátit méně bajtů, než bylo požadováno. Chcete-li přijmout zprávu, WseTcpDuplexSessionChannel přečte bajty z drátu, dekóduje framing DIME a pak použije MessageEncoder k přeměně bajtu[] na Message.

WseTcpDuplexSessionChannel Základ předpokládá, že obdrží připojený soket. Základní třída zpracovává vypnutí soketu. Existují tři místa, která rozhraní s uzavřením soketu:

  • OnAbort -- zavřete soket nechtěně (pevně zavření).

  • On[Begin]Close -- close the socket gracefully (soft close).

  • Relace. CloseOutputSession – vypnutí odchozího datového proudu (půl uzavření).

Vytvoření postupu kanálu

Dalším krokem při psaní přenosu TCP je vytvoření implementace IChannelFactory pro klientské kanály.

  • WseTcpChannelFactory je odvozen od ChannelFactoryBase<IDuplexSessionChannel>. Jedná se o továrnu, která přepisuje OnCreateChannel vytváření klientských kanálů.

protected override IDuplexSessionChannel OnCreateChannel(EndpointAddress remoteAddress, Uri via)

{

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

}

  • ClientWseTcpDuplexSessionChannel přidá logiku do základu WseTcpDuplexSessionChannel pro připojení k serveru TCP v channel.Open čase. Nejprve se název hostitele přeloží na IP adresu, jak je znázorněno v následujícím kódu.

hostEntry = Dns.GetHostEntry(Via.Host);

  • Pak je název hostitele připojený k první dostupné IP adrese ve smyčce, jak je znázorněno v následujícím kódu.

IPAddress address = hostEntry.AddressList[i];

socket = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

socket.Connect(new IPEndPoint(address, port));

  • V rámci kontraktu kanálu jsou všechny výjimky specifické pro doménu zabaleny, například SocketException v CommunicationException.

Naslouchací proces kanálu

Dalším krokem při psaní přenosu TCP je vytvoření implementace IChannelListener pro příjem kanálů serveru.

  • WseTcpChannelListener odvozuje od ChannelListenerBase<IDuplexSessionChannel> a přepisy On[Begin]Open and On[Begin]Close k řízení životnosti jeho naslouchacího soketu. V aplikaci OnOpen se vytvoří soket pro naslouchání na IP_ANY. Pokročilejší implementace můžou také vytvořit druhý soket pro naslouchání IPv6. Můžou také povolit zadání IP adresy v názvu hostitele.

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);

Při přijetí nového soketu se pomocí tohoto soketu inicializuje kanál serveru. Veškerý vstup a výstup je již implementován v základní třídě, takže tento kanál je zodpovědný za inicializaci soketu.

Přidání elementu vazby

Teď, když jsou továrny a kanály vytvořené, musí být vystaveny modulu runtime ServiceModel prostřednictvím vazby. Vazba je kolekce prvků vazby, která představuje zásobník komunikace přidružený k adrese služby. Každý prvek v zásobníku je reprezentován elementem vazby.

V ukázce je WseTcpTransportBindingElementelement vazby , který je odvozen od TransportBindingElement. IDuplexSessionChannel Podporuje a přepíše následující metody pro sestavení továren přidružených k naší vazbě.

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);

}

Obsahuje také členy pro klonování BindingElement a vrácení našeho schématu (wse.tcp).

Testovací konzola WSE TCP

Testovací kód pro použití tohoto ukázkového přenosu je k dispozici v TestCode.cs. Následující pokyny ukazují, jak nastavit ukázku WSE TcpSyncStockService .

Testovací kód vytvoří vlastní vazbu, která jako kódování a WseTcpTransport přenos používá MTOM. Nastaví také adresní verzi, aby odpovídala WSE 3.0, jak je znázorněno v následujícím kódu.

CustomBinding binding = new CustomBinding();

MtomMessageEncodingBindingElement mtomBindingElement = new MtomMessageEncodingBindingElement();

mtomBindingElement.MessageVersion = MessageVersion.Soap11WSAddressingAugust2004;

binding.Elements.Add(mtomBindingElement);

binding.Elements.Add(new WseTcpTransportBindingElement());

Skládá se ze dvou testů – jeden test nastaví typového klienta pomocí kódu generovaného z WSDL WSE 3.0. Druhý test používá WCF jako klienta i server odesláním zpráv přímo nad rozhraníMI API kanálu.

Při spuštění ukázky se očekává následující výstup.

Klient:

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.

Server:

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

Nastavení, sestavení a spuštění ukázky

  1. Chcete-li spustit tuto ukázku, musíte mít nainstalované vylepšení webových služeb (WSE) 3.0 pro Microsoft .NET a ukázku WSE TcpSyncStockService .

Poznámka:

Vzhledem k tomu, že wsE 3.0 není v systému Windows Server 2008 podporován, nemůžete v tomto operačním systému nainstalovat ani spustit ukázku TcpSyncStockService .

  1. Po instalaci ukázky TcpSyncStockService postupujte takto:

    1. Otevřete v sadě TcpSyncStockService Visual Studio. (Ukázka TcpSyncStockService je nainstalovaná s WSE 3.0. Není součástí kódu této ukázky.)

    2. Nastavte projekt StockService jako počáteční projekt.

    3. Otevřete StockService.cs v projektu StockService a zakomentujte atribut [Policy] pro StockService třídu. Tím se zakáže zabezpečení z ukázky. I když WCF může spolupracovat se zabezpečenými koncovými body WSE 3.0, zabezpečení je zakázané, aby se tato ukázka zaměřila na vlastní přenos TCP.

    4. stisknutím klávesy F5 spusťte TcpSyncStockService. Služba se spustí v novém okně konzoly.

    5. Otevřete tuto ukázku přenosu TCP v sadě Visual Studio.

    6. Aktualizujte proměnnou hostname v TestCode.cs tak, aby odpovídala názvu počítače, na kterém běží TcpSyncStockService.

    7. stisknutím klávesy F5 spusťte ukázku přenosu TCP.

    8. Testovací klient přenosu TCP se spustí v nové konzole. Klient požádá o kurzy akcií ze služby a pak zobrazí výsledky v okně konzoly.