Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.
enviando mensagens
Para estar pronto para enviar mensagens e receber e processar respostas, as seguintes etapas são necessárias:
Criar uma associação.
Crie uma fábrica de canais.
Criar um canal.
Envie uma solicitação e leia a resposta.
Feche todos os objetos de canal.
Criando um vínculo
Semelhante ao caso de recebimento (consulte Service Channel-Level Programming), o envio de mensagens começa criando uma associação. Este exemplo cria um novo System.ServiceModel.Channels.CustomBinding e adiciona um System.ServiceModel.Channels.HttpTransportBindingElement à sua coleção Elements.
Criando um ChannelFactory
Em vez de criar um System.ServiceModel.Channels.IChannelListener, desta vez, criamos um System.ServiceModel.ChannelFactory<TChannel> chamando ChannelFactory.CreateFactory na associação em que o parâmetro de tipo é System.ServiceModel.Channels.IRequestChannel. Enquanto os ouvintes de canais são usados pelo lado que aguarda mensagens de entrada, 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 serem usadas.
Criando um canal
Em seguida, chamamos ChannelFactory<TChannel>.CreateChannel para criar um IRequestChannel. Essa chamada usa o endereço do ponto de extremidade com o qual queremos nos comunicar usando o novo canal que está sendo criado. Depois que tivermos um canal, chamamos Abrir 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 não pode fazer nada na rede.
Enviando uma solicitação e lendo a resposta
Depois de termos um canal aberto, podemos criar uma mensagem e usar o método Request do canal para enviar a solicitação e aguardar o retorno da resposta. Assim que este método retorna, temos uma mensagem de resposta que podemos ler para descobrir qual foi a resposta do endpoint.
Como fechar objetos
Para evitar o vazamento de recursos, fechamos os objetos usados nas 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: {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