Programação ao nível do canal do cliente
Este tópico descreve como escrever um aplicativo cliente do Windows Communication Foundation (WCF) sem usar a System.ServiceModel.ClientBase<TChannel> classe e seu modelo de objeto associado.
Envio de mensagens
Para estar pronto para enviar mensagens e receber e processar respostas, as seguintes etapas são necessárias:
Crie uma ligação.
Construa uma fábrica de canais.
Crie um canal.
Envie um pedido e leia a resposta.
Feche todos os objetos de canal.
Criando uma vinculação
Semelhante ao caso de recebimento (consulte Programação no nível do canal de serviço), o envio de mensagens começa com a criação de uma ligação. Este exemplo cria um novo System.ServiceModel.Channels.CustomBinding e adiciona um System.ServiceModel.Channels.HttpTransportBindingElement à sua coleção Elements.
Construindo uma ChannelFactory
Em vez de criar um System.ServiceModel.Channels.IChannelListener, desta vez criamos um System.ServiceModel.ChannelFactory<TChannel> chamando ChannelFactory.CreateFactory a ligação onde o parâmetro type é System.ServiceModel.Channels.IRequestChannel. Enquanto os ouvintes de canal são usados pelo lado que aguarda as mensagens recebidas, as fábricas de canais são usadas pelo lado que inicia a comunicação para criar um canal. Assim como os ouvintes de canais, as fábricas de canais devem ser abertas primeiro antes de poderem ser usadas.
Criando um canal
Em seguida, chamamos ChannelFactory<TChannel>.CreateChannel para criar um IRequestChannelarquivo . Esta chamada leva o endereço do ponto de extremidade com o qual queremos nos comunicar usando o novo canal que está sendo criado. Uma vez que temos um canal, chamamos a Open para colocá-lo em um estado pronto para comunicação. Dependendo da natureza do transporte, essa chamada para Abrir pode iniciar uma conexão com o ponto de extremidade de destino ou pode não fazer nada na rede.
Enviar um pedido e ler a resposta
Uma vez que tenhamos um canal aberto, podemos criar uma mensagem e usar o método de solicitação do canal para enviar a solicitação e esperar que a resposta retorne. Quando esse método retorna, temos uma mensagem de resposta que podemos ler para descobrir qual foi a resposta do ponto de extremidade.
Fechando objetos
Para evitar vazamentos de recursos, fechamos objetos usados em comunicações quando eles não são mais necessários.
O exemplo de código a seguir mostra um cliente básico usando a fábrica de canais para enviar uma mensagem e ler a resposta.
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