Programování na úrovni kanálu klienta
Toto téma popisuje, jak napsat klientskou aplikaci WCF (Windows Communication Foundation) bez použití třídy a přidruženého System.ServiceModel.ClientBase<TChannel> objektového modelu.
Odesílání zpráv
Abyste mohli posílat zprávy a přijímat a zpracovávat odpovědi, je potřeba provést následující kroky:
Vytvořte vazbu.
Sestavte objekt pro vytváření kanálů.
Vytvořte kanál.
Odešlete žádost a přečtete odpověď.
Zavřete všechny objekty kanálu.
Vytvoření vazby
Podobně jako u přijímajícího případu (viz Programování na úrovni kanálu služby) začíná odesílání zpráv vytvořením vazby. Tento příklad vytvoří novou System.ServiceModel.Channels.CustomBinding a přidá do System.ServiceModel.Channels.HttpTransportBindingElement své kolekce Elements.
Sestavení ChannelFactory
Místo vytvoření , System.ServiceModel.Channels.IChannelListenertentokrát vytvoříme System.ServiceModel.ChannelFactory<TChannel> voláním ChannelFactory.CreateFactory vazby, kde je System.ServiceModel.Channels.IRequestChannelparametr typu . Zatímco naslouchací procesy kanálu se používají vedle sebe, které čekají na příchozí zprávy, používají se továrny kanálů vedle sebe, které zahájí komunikaci k vytvoření kanálu. Stejně jako naslouchací procesy kanálu musí být objekty pro vytváření kanálů otevřené jako první, než je lze použít.
Vytvoření kanálu
Pak zavolámeChannelFactory<TChannel>.CreateChannel, abychom vytvořili .IRequestChannel Toto volání přebírá adresu koncového bodu, se kterým chceme komunikovat pomocí nového kanálu, který se vytváří. Jakmile máme kanál, zavoláme na něj Otevřít, abychom ho připravili na komunikaci. V závislosti na povaze přenosu může toto volání open zahájit spojení s cílovým koncovým bodem nebo nemusí v síti vůbec nic dělat.
Odeslání žádosti a přečtení odpovědi
Jakmile máme otevřený kanál, můžeme vytvořit zprávu a použít metodu Request kanálu k odeslání požadavku a počkat, až se odpověď vrátí. Když se tato metoda vrátí, máme zprávu odpovědi, kterou můžeme přečíst, abychom zjistili, co odpověď koncového bodu byla.
Zavírání objektů
Abychom zabránili úniku prostředků, zavřeme objekty používané při komunikaci, když už nejsou potřeba.
Následující příklad kódu ukazuje základního klienta, který používá objekt pro vytváření kanálů k odeslání zprávy a přečtení odpovědi.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
namespace ProgrammingChannels
{
class Client
{
static void RunClient()
{
//Step1: Create a binding with just HTTP.
BindingElement[] bindingElements = new BindingElement[2];
bindingElements[0] = new TextMessageEncodingBindingElement();
bindingElements[1] = new HttpTransportBindingElement();
CustomBinding binding = new CustomBinding(bindingElements);
//Step2: Use the binding to build the channel factory.
IChannelFactory<IRequestChannel> factory =
binding.BuildChannelFactory<IRequestChannel>(
new BindingParameterCollection());
//Open the channel factory.
factory.Open();
//Step3: Use the channel factory to create a channel.
IRequestChannel channel = factory.CreateChannel(
new EndpointAddress("http://localhost:8080/channelapp"));
channel.Open();
//Step4: Create a message.
Message requestmessage = Message.CreateMessage(
binding.MessageVersion,
"http://contoso.com/someaction",
"This is the body data");
//Send message.
Message replymessage = channel.Request(requestmessage);
Console.WriteLine("Reply message received");
Console.WriteLine("Reply action: {0}",
replymessage.Headers.Action);
string data = replymessage.GetBody<string>();
Console.WriteLine("Reply content: {0}", data);
//Step5: Do not forget to close the message.
replymessage.Close();
//Do not forget to close the channel.
channel.Close();
//Do not forget to close the factory.
factory.Close();
}
public static void Main()
{
Console.WriteLine("Press [ENTER] when service is ready");
Console.ReadLine();
RunClient();
Console.WriteLine("Press [ENTER] to exit");
Console.ReadLine();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Configuration
Namespace ProgrammingChannels
Friend Class Client
Private Shared Sub RunClient()
'Step1: Create a binding with just HTTP.
Dim bindingElements(1) As BindingElement = {New TextMessageEncodingBindingElement(), _
New HttpTransportBindingElement()}
Dim binding As New CustomBinding(bindingElements)
'Step2: Use the binding to build the channel factory.
Dim factory = binding.BuildChannelFactory(Of IRequestChannel)(New BindingParameterCollection())
'Open the channel factory.
factory.Open()
'Step3: Use the channel factory to create a channel.
Dim channel = factory.CreateChannel(New EndpointAddress("http://localhost:8080/channelapp"))
channel.Open()
'Step4: Create a message.
Dim requestmessage = Message.CreateMessage(binding.MessageVersion, _
"http://contoso.com/someaction", _
"This is the body data")
'Send message.
Dim replymessage = channel.Request(requestmessage)
Console.WriteLine("Reply message received")
Console.WriteLine("Reply action: {0}", replymessage.Headers.Action)
Dim data = replymessage.GetBody(Of String)()
Console.WriteLine("Reply content: {0}", data)
'Step5: Do not forget to close the message.
replymessage.Close()
'Do not forget to close the channel.
channel.Close()
'Do not forget to close the factory.
factory.Close()
End Sub
Public Shared Sub Main()
Console.WriteLine("Press [ENTER] when service is ready")
Console.ReadLine()
RunClient()
Console.WriteLine("Press [ENTER] to exit")
Console.ReadLine()
End Sub
End Class
End Namespace