Compartilhar via


Programação de nível de canal cliente

Este tópico descreve como escrever um aplicativo cliente WCF (Windows Communication Foundation) sem usar a classe System.ServiceModel.ClientBase<TChannel> 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:

  1. Criar uma associação.

  2. Criar uma fábrica de canais.

  3. Criar um canal.

  4. Enviar uma solicitação e ler a resposta.

  5. Fechar todos os objetos de canal.

Criar uma associação

Semelhante ao caso de recebimento (consulte Programação de nível por canal de serviço), 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 Elementos.

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 que tivermos um canal aberto, poderemos criar uma mensagem e usar o método Solicitação do canal para enviar a solicitação e aguardar a resposta voltar. 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 o vazamento de recursos, fechamos 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: {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