Compartir a través de


Ejemplo de conversaciones

Download sample

Este ejemplo muestra cómo un servicio del flujo de trabajo puede tener las conversaciones paralelas con varios clientes sobre el mismo contrato. El ejemplo muestra cómo poner en correlación mensajes que se envían para el mismo contrato y la misma operación pero que se deben administrar de manera diferente porque los envían clientes diferentes. Para lograr las conversaciones paralelas, este ejemplo utiliza la funcionalidad del contexto de conversación proporcionada por servicios del flujo de trabajo.

Nota

Para generar y ejecutar este ejemplo, es necesario que esté instalado .NET Framework versión 3.5. Para abrir los archivos de solución y proyecto se necesita Visual Studio 2008.

Para obtener más información acerca de que prepara este ejemplo, consulte Procedimiento de instalación único para ejemplos de Windows Communication Foundation.

Este ejemplo también utiliza la comunicación dúplex asincrónica para que el servicio del flujo de trabajo y el cliente puedan comunicarse de forma asincrónica. En comunicación dúplex, las dos aplicaciones deben intercambiar un contexto antes de que comience la comunicación. El servicio que inicia la conversación recibe el contexto en la respuesta a su mensaje. Los servicios del flujo de trabajo proporcionan esta funcionalidad. Para admitir la comunicación del servicio receptor al servicio iniciador, el servicio iniciador debe enviar su información de contexto en el primer mensaje. La arquitectura del ejemplo se muestra en la figura 1.

Arquitectura de ejemplo de conversaciones

Figura 1: Ejemplos de conversaciones

Este ejemplo implementa el escenario siguiente.

Un cliente envía una solicitud para una orden. En respuesta a esto, el proveedor desea obtener los presupuestos de tres proveedores de logística diferentes para distribuir la orden. El proveedor envía un mensaje a los tres proveedores. Cada uno de los proveedores devuelve una comilla invocando la misma operación en el mismo contrato. Dado que el flujo de trabajo del proveedor utiliza el contexto de la conversación, la funcionalidad puede poner en correlación los presupuestos a la actividad correctamente recibida, para seguir procesándola. El proveedor recibe todos los presupuestos, escoge el mínimo y lo envía al cliente.

Cinco entidades se comunican en este ejemplo:

  • Servicio al cliente

    El servicio al cliente envía los detalles de la orden al proveedor, junto con un contexto que el servicio del proveedor utiliza después para comunicar de nuevo con el servicio al cliente. Este flujo de trabajo básico contiene una actividad Send inicial, que envía el mensaje de solicitud del pedido de compra con el pedido de compra y el contexto como cargas útiles. Una actividad Receive espera una respuesta del servicio del proveedor.

    El contexto que el servicio al cliente envía está asociado a la actividad Receive. El controlador "antes de enviar" de la actividad Send contiene el código que obtiene el contexto en la actividad Receive. La actividad Receive incluye el método GetContext siguiente, al que se llama para obtener el contexto.

    private void PrepareOrder(object sender, SendActivityEventArgs e)
    {
        this.order.Amount = 1000;
        this.order.OrderId = 1234;
        this.contextToSend = this.ReceiveOrderDetails.Context;
    }
    
  • Servicio del proveedor

    El servicio del proveedor se comunica con tres proveedores de logística. Utiliza una combinación de un token del contexto único para cada conversación y la comunicación dúplex asincrónica para ello. Envía el contexto en el cuerpo del mensaje de la comunicación entre los servicios de proveedor y cliente.

    Antes de comunicar con los proveedores de logística, el servicio del proveedor recibe primero el mensaje del servicio al cliente. En este mensaje, el servicio del proveedor recibe también el contexto que utiliza para comunicarse de nuevo con el servicio al cliente. El flujo de trabajo de servicio de proveedor aplica este contexto a la actividad Send que se utiliza para enviar un mensaje al servicio del cliente. El código que implementa esta funcionalidad está en el controlador del código de la actividad Code dentro de la primera actividad Receive, como se muestra en el código siguiente.

    private void AcceptOrder(object sender, EventArgs e)
    {
        Console.WriteLine("Order Received...");
        this.supplierAck = "Order Received on " + DateTime.Now;
        this.SendOrderDetails.Context = this.customerContext;
    }
    

    Cuando el servicio del proveedor recibe un mensaje del cliente, el proveedor inicia tres conversaciones paralelas con los tres proveedores de logística. Cada bifurcación de la conversación tiene Send y una actividad Receive, como se muestra en la ilustración anterior. Las actividades Send en cada bifurcación envían el mensaje a un proveedor de logística. La actividad Receive correspondiente en esa bifurcación debe recuperar el mensaje del proveedor. Para esto, la actividad Send en la carga útil del mensaje debe enviar un contexto único en la carga útil. El proveedor de logística utiliza a continuación este contexto en el encabezado del mensaje cuando devuelve el mensaje con el presupuesto.

    De forma predeterminada, cada actividad Receive tiene un contexto de la raíz. Para hacer la actividad Receive única, la actividad Receive define el ámbito del contexto para una actividad primaria distinta de la actividad raíz. En el ejemplo siguiente, la propiedad de token de contexto de cada actividad Receive en la conversación paralela tiene un nombre único y se investiga la actividad paralela en la que se contiene. Cuando la actividad Send dentro de cada una de las bifurcaciones paralelas obtiene un contexto de la actividad Receive, obtiene un contexto que es único para esa actividad Receive. Este contexto único también se utiliza para crear un nombre de la cola para la cola en la que la actividad Receive está realizando escuchas. Cuando el proveedor de logística devuelve el presupuesto con el contexto en el encabezado, la capa de expedición del servicio del flujo de trabajo la utiliza para crear el nombre de la cola adecuado y poner en la cola el mensaje, que la actividad Receive examina a continuación.

    private void PrepareShipper2Request(object sender, SendActivityEventArgs e)

    {

    Console.ForegroundColor = ConsoleColor.Green;

    Console.WriteLine("RequestShippingQuote from Shipper2");

    Console.ResetColor();

    this.contextShipper2 = this.ReceiveQuoteFromShipper2.Context;

    }

    Los flujos de trabajo de proveedor de logística reciben la solicitud del presupuesto del proveedor, junto con el contexto. Ese contexto se aplica a la actividad Send que devuelve el mensaje al proveedor, tal y como muestra el código siguiente.

    private void AcceptQuoteRequest(object sender, EventArgs e)
    {
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Received ShippingQuote Request");
        this.supplierAck = "Working on quote...";
        Console.ResetColor();
        this.SendShippingQuote.Context(this.supplierContext);
    }
    

Para configurar, generar y ejecutar el ejemplo

  1. De forma predeterminada, este ejemplo no utiliza la persistencia. Si desea la persistencia, necesita agregar la entrada <WorkflowRuntime> en el archivo App.config para cada una de las soluciones. La entrada debe estar bajo la sección behaviors, como se muestra en el ejemplo siguiente.

    <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior"  >
              <serviceMetadata httpGetEnabled="false" />
              <serviceDebug includeExceptionDetailInFaults="true" />
              <workflowRuntime name="WorkflowServiceHostRuntime" validateOnCreate="true" enablePerformanceCounters="true">
                <services>
                  <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                       connectionString="Data Source=localhost\sqlexpress;Initial Catalog=ServiceModelSamples_ServiceWorkflowStore;Integrated Security=True;Pooling=False"
                       LoadIntervalSeconds="1" UnLoadOnIdle= "true" />
                </services>
              </workflowRuntime>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
  2. Además de la entrada <WorkflowRuntime> en la sección behaviors, también se agrega un Servicio de SQL de persistencia. Ejecute el script CreateStores.cmd situado en el tema Procedimiento de instalación único para ejemplos de Windows Communication Foundation. El script CreateStores.cmd crea la base de datos ServiceModelSamples_ServiceWorkflowStore. De forma predeterminada, estas bases de datos se crean en una base de datos SQL Server 2005 Express Edition. Asegúrese de que tiene SQL Server Express instalado en su equipo. Si no desea instalar SQL Server Express y prefiere utilizar en su lugar SQL Server, asegúrese de modificar las cadenas de conexión en los archivos App.config para las bases de datos de persistencia.

  3. Cuando todos los servicios del flujo de trabajo se estén ejecutando, presione Entrar en el flujo de trabajo del cliente para ver todos los flujos de trabajo que comunican entre sí. El pedido de compra se envía al proveedor que, a su vez, envía las solicitudes de presupuestos a todos los proveedores de logística. Cuando el proveedor recibe los presupuestos, puede ver que el presupuesto más bajo se devuelve al cliente. También puede comprobar los tokens del contexto en cada caso. Esto ayuda a entender los contextos únicos que se envían a cada proveedor de logística.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.