Compartir por


Dúplex

En el ejemplo Dúplex se muestra cómo definir e implementar un contrato dúplex. La comunicación dúplex se produce cuando un cliente establece una sesión con un servicio y proporciona al servicio un canal en el que el servicio puede devolver mensajes al cliente. Este ejemplo se basa en la introducción. Un contrato dúplex se define como un par de interfaces: una interfaz principal del cliente hacia el servicio y una interfaz de retorno del servicio al cliente. En este ejemplo, la ICalculatorDuplex interfaz permite al cliente realizar operaciones matemáticas, calculando el resultado en una sesión. El servicio devuelve resultados en la ICalculatorDuplexCallback interfaz . Un contrato dúplex requiere una sesión, porque se debe establecer un contexto para poner en correlación el conjunto de mensajes que se envían entre el cliente y el servicio.

Nota:

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

En este ejemplo, el cliente es una aplicación de consola (.exe) y los Servicios de Internet Information Server (IIS) hospedan el servicio. El contrato dúplex se define de la siguiente manera:

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required,
                 CallbackContract=typeof(ICalculatorDuplexCallback))]
public interface ICalculatorDuplex
{
    [OperationContract(IsOneWay = true)]
    void Clear();
    [OperationContract(IsOneWay = true)]
    void AddTo(double n);
    [OperationContract(IsOneWay = true)]
    void SubtractFrom(double n);
    [OperationContract(IsOneWay = true)]
    void MultiplyBy(double n);
    [OperationContract(IsOneWay = true)]
    void DivideBy(double n);
}

public interface ICalculatorDuplexCallback
{
    [OperationContract(IsOneWay = true)]
    void Result(double result);
    [OperationContract(IsOneWay = true)]
    void Equation(string eqn);
}

La CalculatorService clase implementa la interfaz principal ICalculatorDuplex . El servicio usa el PerSession modo de instancia para mantener el resultado de cada sesión. Una propiedad privada denominada Callback se utiliza para tener acceso al canal de devolución de llamadas hasta el cliente. El servicio utiliza la devolución de llamada para devolver los mensajes al cliente a través de la interfaz de devolución de llamada.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorDuplex
{
    double result = 0.0D;
    string equation;

    public CalculatorService()
    {
        equation = result.ToString();
    }

    public void Clear()
    {
        Callback.Equation($"{equation} = {result}");
        equation = result.ToString();
    }

    public void AddTo(double n)
    {
        result += n;
        equation += $" + {n}";
        Callback.Result(result);
    }

    //...

    ICalculatorDuplexCallback Callback
    {
        get
        {
            return OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
        }
    }
}

El cliente debe proporcionar una clase que implemente la interfaz de devolución de llamadas del contrato dúplex para recibir los mensajes del servicio. En el ejemplo, se define una CallbackHandler clase para implementar la ICalculatorDuplexCallback interfaz .

public class CallbackHandler : ICalculatorDuplexCallback
{
   public void Result(double result)
   {
      Console.WriteLine("Result({0})", result);
   }

   public void Equation(string equation)
   {
      Console.WriteLine("Equation({0}", equation);
   }
}

El proxy que se genera para un contrato dúplex requiere que se proporcione unInstanceContext en la construcción. Esta InstanceContext se utiliza como sitio para un objeto que implementa la interfaz de devolución de llamadas y administra mensajes que se devuelven desde el servicio. InstanceContext se construye con una instancia de la clase CallbackHandler. Este objeto administra mensajes enviados desde el servicio al cliente en la interfaz de devolución de llamadas.

// Construct InstanceContext to handle messages on callback interface.
InstanceContext instanceContext = new InstanceContext(new CallbackHandler());

// Create a client.
CalculatorDuplexClient client = new CalculatorDuplexClient(instanceContext);

Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.");
Console.WriteLine();

// Call the AddTo service operation.
double value = 100.00D;
client.AddTo(value);

// Call the SubtractFrom service operation.
value = 50.00D;
client.SubtractFrom(value);

// Call the MultiplyBy service operation.
value = 17.65D;
client.MultiplyBy(value);

// Call the DivideBy service operation.
value = 2.00D;
client.DivideBy(value);

// Complete equation.
client.Clear();

Console.ReadLine();

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

La configuración se ha modificado para proporcionar un enlace que admita la comunicación de sesión y la comunicación dúplex. El wsDualHttpBinding admite la comunicación de sesión y permite la comunicación dúplex proporcionando dos conexiones HTTP, una para cada dirección. En el servicio, la única diferencia en la configuración es la vinculación que se utiliza. En el cliente, debe configurar una dirección que el servidor pueda usar para conectarse al cliente, como se muestra en la siguiente configuración de ejemplo.

<client>
  <endpoint name=""
            address="http://localhost/servicemodelsamples/service.svc"
            binding="wsDualHttpBinding"
            bindingConfiguration="DuplexBinding"
            contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" />
</client>

<bindings>
  <!-- Configure a binding that support duplex communication. -->
  <wsDualHttpBinding>
    <binding name="DuplexBinding"
             clientBaseAddress="http://localhost:8000/myClient/">
    </binding>
  </wsDualHttpBinding>
</bindings>

Cuando ejecute el ejemplo, verá los mensajes que se devuelven al cliente en la interfaz de retroalimentación que se envía desde el servicio. Cada resultado intermedio se muestra, seguido de toda la ecuación tras la finalización de todas las operaciones. Presione Entrar para cerrar el cliente.

Para configurar, compilar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. Para compilar la edición de .NET de C#, C++o Visual Basic de la solución, siga las instrucciones de Creación de ejemplos de Windows Communication Foundation.

  3. Para ejecutar el ejemplo en una configuración de una máquina única o entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.

    Importante

    Al ejecutar el cliente en una configuración entre máquinas, asegúrese de reemplazar "localhost" en el atributo address del <endpoint> del elemento <cliente> y en el atributo clientBaseAddress del <elemento de binding> del <elemento wsDualHttpBinding> con el nombre de la máquina adecuada, como se muestra en lo siguiente:

    <client>
        <endpoint name = ""
        address="http://service_machine_name/servicemodelsamples/service.svc"
        ... />
    </client>
    ...
    <wsDualHttpBinding>
        <binding name="DuplexBinding" clientBaseAddress="http://client_machine_name:8000/myClient/">
        </binding>
    </wsDualHttpBinding>