Программирование клиентов на уровне канала
В данном разделе описывается, как создать клиентское приложение Windows Communication Foundation (WCF), не используя класс System.ServiceModel.ClientBase и связанную с ним объектную модель.
Отправка сообщений
Чтобы подготовиться к отправке сообщений и получению и обработке ответов, необходимы следующие действия.
Создайте привязку.
Создайте фабрику каналов.
Создайте канал.
Отправьте запрос и прочитайте ответ.
Закройте все объекты каналов.
Создание привязки
Процедура отправки сообщений аналогична процедуре их получения (см. раздел Программирование служб на уровне канала) в том, что в первую очередь создается привязка. В данном примере создается новая привязка System.ServiceModel.Channels.CustomBinding, и в коллекцию ее элементов добавляется элемент System.ServiceModel.Channels.HttpTransportBindingElement.
Создание фабрики каналов
На этот раз вместо того чтобы создавать прослушиватель каналов System.ServiceModel.Channels.IChannelListener, следует создать производство каналов System.ServiceModel.ChannelFactory вызовом метода System.ServiceModel.ChannelFactory.CreateFactory в привязке с параметром типа System.ServiceModel.Channels.IRequestChannel. Прослушиватели каналов используются ожидающей входящих сообщений стороной, а фабрики каналов — стороной, которая инициирует связь для создания канала. Точно так же, как при работе с прослушивателями каналов, фабрики каналов можно использовать только после того, как они будут открыты.
Создание канала
Затем, чтобы создать канал IRequestChannel, необходимо вызвать метод System.ServiceModel.ChannelFactory.CreateChannel. Этот вызов принимает адрес конечной точки, с которой необходимо установить связь, используя вновь создаваемый канал. После создания канала необходимо вызвать для него функцию "Открыть", чтобы подготовить его к взаимодействию. В зависимости от особенностей транспорта подобный вызов функции "Открыть" может инициировать соединение с целевой конечной точкой или не выполнить никаких действий в сети.
Отправка запроса и чтение ответа
После открытия канала можно создать сообщение, воспользоваться методом запроса канала для отправки запроса и ожидать ответа. По возвращении этого метода приходит ответное сообщение, прочитав которое, можно узнать, каков был ответ конечной точки.
Закрытие объектов
Во избежание утечки ресурсов следует закрывать объекты, используемые во взаимодействии, если они больше не требуются.
В следующем примере кода показан основной клиент, использующий фабрику каналов для отправки сообщения и чтения ответа.
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("https://localhost:8080/channelapp"));
channel.Open();
//Step4: Create a message.
Message requestmessage = Message.CreateMessage(
binding.MessageVersion,
"https://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();
}
}
}