Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
В этом разделе описывается, как написать клиентское приложение Windows Communication Foundation (WCF) без использования класса System.ServiceModel.ClientBase<TChannel> и связанной с ней объектной модели.
Отправка сообщений
Чтобы быть готовым к отправке сообщений и получению и обработке ответов, необходимо выполнить следующие действия:
Создайте привязку.
Постройте фабрику каналов.
Создайте канал.
Отправьте запрос и прочтите ответ.
Закройте все объекты канала.
Создание привязки
Как и в случае получения (см. service Channel-Level Программирование), отправка сообщений начинается с создания привязки. В этом примере создается новый System.ServiceModel.Channels.CustomBinding и добавляется System.ServiceModel.Channels.HttpTransportBindingElement в коллекцию Элементов.
Создание ChannelFactory
Вместо создания System.ServiceModel.Channels.IChannelListenerмы создадим System.ServiceModel.ChannelFactory<TChannel> путем вызова ChannelFactory.CreateFactory в привязке, где параметр типа System.ServiceModel.Channels.IRequestChannel. Хотя прослушиватели каналов используются стороной, которая ожидает входящих сообщений, фабрики каналов используются стороной, которая инициирует обмен данными для создания канала. Так же, как прослушиватели каналов, фабрики каналов должны быть открыты сначала, прежде чем их можно будет использовать.
Создание канала
Затем мы вызываем ChannelFactory<TChannel>.CreateChannel для создания IRequestChannel. Этот вызов принимает адрес конечной точки, с которой мы хотим взаимодействовать с помощью создаваемого нового канала. Когда у нас есть канал, мы вызываем функцию Open, чтобы поместить его в состояние, готовое к обмену данными. В зависимости от характера транспорта этот вызов Open может инициировать подключение к целевой конечной точке или ничего не делать вообще в сети.
Отправка запроса и чтение ответа
После открытия канала можно создать сообщение и использовать метод запроса канала для отправки запроса и ожидания возврата ответа. Когда этот метод возвращается, у нас есть ответное сообщение, которое можно прочитать, чтобы узнать, какой ответ конечной точки был.
Закрытие объектов
Чтобы избежать утечки ресурсов, мы закрываем объекты, используемые в обмене данными, когда они больше не требуются.
В следующем примере кода показан базовый клиент, использующий фабрику каналов для отправки сообщения и чтения ответа.
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: {replymessage.Headers.Action}");
string data = replymessage.GetBody<string>();
Console.WriteLine($"Reply content: {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