Condividi tramite


Programmazione Channel-Level client

In questo argomento viene descritto come scrivere un'applicazione client Windows Communication Foundation (WCF) senza usare la classe e il System.ServiceModel.ClientBase<TChannel> modello a oggetti associato.

Invio di messaggi

Per essere pronti per inviare messaggi e ricevere ed elaborare le risposte, sono necessari i passaggi seguenti:

  1. Creare un legame.

  2. Costruisci una fabbrica di canali.

  3. Creare un canale.

  4. Inviare una richiesta e leggere la risposta.

  5. Chiudere tutti gli oggetti del canale.

Creazione di un collegamento

Analogamente al caso di ricezione (vedere Service Channel-Level Programming), l'invio di messaggi inizia creando un'associazione. In questo esempio viene creato un nuovo System.ServiceModel.Channels.CustomBinding e viene aggiunto un altro all'insieme System.ServiceModel.Channels.HttpTransportBindingElement di elementi.

Compilazione di channelFactory

Anziché creare un oggetto System.ServiceModel.Channels.IChannelListener, questa volta si crea un oggetto System.ServiceModel.ChannelFactory<TChannel> chiamando ChannelFactory.CreateFactory sull'associazione in cui il parametro di tipo è System.ServiceModel.Channels.IRequestChannel. Mentre i listener di canale vengono usati sul lato che attende i messaggi in arrivo, le channel factory vengono usate dal lato che avvia la comunicazione per creare un canale. Proprio come i listener di canale, le channel factory devono essere aperte prima di poter essere usate.

Creazione di un canale

Viene quindi chiamato ChannelFactory<TChannel>.CreateChannel per creare un oggetto IRequestChannel. Questa chiamata usa l'indirizzo dell'endpoint con cui si desidera comunicare attraverso il nuovo canale in fase di creazione. Dopo aver creato un canale, chiamiamo Open su di esso per inserirlo in uno stato pronto per la comunicazione. A seconda della natura del trasporto, questa chiamata a Open può avviare una connessione con l'endpoint di destinazione o non eseguire alcuna operazione in rete.

Invio di una richiesta e lettura della risposta

Dopo aver aperto un canale, è possibile creare un messaggio e usare il metodo Request del canale per inviare la richiesta e attendere il ritorno della risposta. Al termine di questo metodo, è disponibile un messaggio di risposta che è possibile leggere per scoprire qual è la risposta dell'endpoint.

Chiusura di oggetti

Per evitare perdite di risorse, chiudiamo gli oggetti usati nelle comunicazioni quando non sono più necessari.

Nell'esempio di codice seguente viene illustrato un client di base che usa la channel factory per inviare un messaggio e leggere la risposta.

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