Control de versiones en paralelo en WorkflowServiceHost

El control de versiones en paralelo en WorkflowServiceHost presentado en .NET Framework 4.5 ofrece la capacidad de hospedar varias versiones de un servicio de flujo de trabajo en un único punto de conexión. La funcionalidad en paralelo proporcionada permite configurar un servicio de flujo de trabajo para crear nuevas instancias del servicio de flujo de trabajo usando la nueva definición de flujo de trabajo, mientras que las instancias en ejecución se completan usando la definición existente. Este tema proporciona información general sobre la ejecución en paralelo del servicio de flujo de trabajo mediante WorkflowServiceHost.

Hospedar varias versiones en un servicio de flujo de trabajo

WorkflowServiceHost contiene dos propiedades que se pueden configurar para permitir la ejecución en paralelo de varias versiones de un flujo de trabajo: SupportedVersions y DefinitionIdentity. SupportedVersions contiene las versiones admitidas del servicio de flujo de trabajo y DefinitionIdentity se usa para identificar de forma única cada servicio de flujo de trabajo. Esto se hace asociando WorkflowIdentity al servicio de flujo de trabajo. WorkflowIdentity contiene tres elementos de información de identificación. Name y Version contienen un nombre y Version y son necesarios, y Package es opcional y se puede usar para especificar una cadena adicional que contiene información como el nombre del ensamblado u otra información deseada. Cada servicio de flujo de trabajo contenido en la colección SupportedVersions debe tener una WorkflowIdentity única. WorkflowIdentity es único si cualquiera de sus tres propiedades son diferentes de otra WorkflowIdentity. nullWorkflowIdentity es un valor permitido para DefinitionIdentity, pero solo una versión anterior de un servicio de flujo de trabajo puede tener nullWorkflowIdentity.

Importante

Un objeto WorkflowIdentity no debe contener información de identificación personal (PII). WorkflowIdentity se compone de tres partes: Name (String), Version (Version) y Package (String). El runtime emite la información acerca del elemento WorkflowIdentity usado para crear una instancia a cualquier servicio de seguimiento configurado en diferentes puntos del ciclo de vida de actividad. El seguimiento de WF no tiene ningún mecanismo para ocultar la PII (datos de usuario confidenciales). Por lo tanto, una instancia de WorkflowIdentity no debe contener datos PII ya que el runtime los emitirá en registros de seguimiento y serán visibles para cualquiera que tenga acceso para ver los registros de seguimiento.

Reglas para hospedar varias versiones de un servicio de flujo de trabajo

Cuando un usuario agrega una versión adicional a WorkflowServiceHost, se deben cumplir varias condiciones para que un servicio de flujo de trabajo se hospede con el mismo conjunto de puntos de conexión y descripción. Si cualquiera de las versiones adicionales no cumple estas condiciones, WorkflowServiceHost produce una excepción cuando se llama a Open. Cada definición de flujo de trabajo proporcionada al host como versión adicional debe cumplir los requisitos siguientes (donde la versión principal es la definición de servicio de flujo de trabajo que se proporciona al constructor de host). La versión adicional del flujo de trabajo debe:

  • Tenga el mismo Name que la versión principal del servicio de flujo de trabajo.

  • No debe tener ninguna actividad Receive o SendReply en su Body que no esté en la versión principal y deben coincidir con el contrato de operación.

  • Tenga una DefinitionIdentity única. Una única definición de flujo de trabajo puede tener una nullDefinitionIdentity.

Se permiten algunos cambios. Los elementos siguientes pueden ser diferentes en las versiones:

Configurar DefinitionIdentity

Cuando un servicio de flujo de trabajo se crea mediante el diseñador de flujos de trabajo, DefinitionIdentity se establece mediante la ventana Propiedades. Haga clic fuera de la actividad raíz del servicio en el diseñador para seleccionar el servicio de flujo de trabajo y elija Ventana Propiedades en el menú Ver. Seleccione WorkflowIdentity en la lista desplegable que aparece junto a la propiedad DefinitionIdentity, y expanda y especifique las propiedades deseadas de WorkflowIdentity. En el ejemplo siguiente, DefinitionIdentity se configura con NameMortgageWorkflow y Version de 1.0.0.0. Package es opcional y en este ejemplo es null.

Screenshot that shows the DefinitionIdentity property.

Cuando un servicio de flujo de trabajo se hospeda a sí mismo, se configura DefinitionIdentity cuando se construye el servicio de flujo de trabajo. En el ejemplo siguiente, DefinitionIdentity se configura con los mismos valores que el ejemplo anterior, con NameMortgageWorkflow y Name de 1.0.0.0.

WorkflowService service = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflow(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(1, 0, 0, 0)  
    }  
};  
Dim service As New WorkflowService  
With service  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflow  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(1, 0, 0, 0) _  
    }  
End With  

DefinitionIdentity no es necesario, aunque solo una versión del servicio de flujo de trabajo puede tener nullDefinitionIdentity.

Nota:

Esto es útil si el servicio se implementó inicialmente sin una DefinitionIdentity configurada y, a continuación, se creó una versión actualizada.

Agregar una nueva versión a un servicio de flujo de trabajo hospedado en web

El primer paso para configurar una nueva versión de un servicio de flujo de trabajo en un servicio hospedado en web es crear una nueva carpeta en la carpeta App_Code que tiene el mismo nombre que el archivo de servicio. Si el archivo xamlx del servicio se denomina MortgageWorkflow.xamlx, la carpeta se debe llamar MortgageWorkflow. Coloque una copia del archivo xamlx del servicio original en esta carpeta y asígnele un nuevo nombre, como MortgageWorkflowV1.xamlx. Realice los cambios deseados al servicio primario, actualice su DefinitionIdentity y después implemente el servicio. En el ejemplo siguiente se ha actualizado DefinitionIdentity con un Name de MortgageWorkflow y una Version de 2.0.0.0.

Screenshot that shows DefinitionIdentity of WorkflowIdentity.

Cuando se reinicie el servicio, la versión anterior se agregará automáticamente a la colección SupportedVersions porque se encuentra en la subcarpeta App_Code designada. Tenga en cuenta que si la versión principal del servicio de flujo de trabajo tiene nullDefinitionIdentity, las versiones anteriores no se agregarán. Una versión puede tener una nullDefinitionIdentity, pero si hay varias versiones la versión principal no debe ser la que tenga una nullDefinitionIdentity o bien las versiones anteriores no se agregarán a la colección SupportedVersions.

Agregar una nueva versión a un servicio de flujo de trabajo autohospedado

Al agregar una nueva versión a un servicio de flujo de trabajo autohospedado, WorkflowServiceHost se configura con la versión principal del servicio de flujo de trabajo y las versiones anteriores deben agregarse explícitamente a la colección SupportedVersions. En el ejemplo siguiente, WorkflowServiceHost se configura con un servicio primario de flujo de trabajo que usa una definición de flujo de trabajo de MortgageWorkflowV2 y se agrega un servicio de flujo de trabajo configurado con una definición de flujo de trabajo de MortgageWorkflowV1 a la colección SupportedVersions. Cada servicio de flujo de trabajo se configura con una DefinitionIdentity única que refleja la versión de la definición de flujo de trabajo.

// Create the primary version of the workflow service.  
WorkflowService serviceV2 = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflowV2(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(2, 0, 0, 0)  
    }  
};  
  
// Configure the WorkflowServiceHost with the current version  
// of the workflow service. This code requires Administrator  
// privileges to function correctly. If running from Visual  
// Studio, Visual Studio must be run with Administrator privileges.  
WorkflowServiceHost host = new WorkflowServiceHost(serviceV2,
    new Uri("http://localhost:8080/MortgageWorkflowService"));  
  
// Create the previous version of the workflow service.  
WorkflowService serviceV1 = new WorkflowService  
{  
    Name = "MortgageWorkflowService",  
    Body = new MortgageWorkflowV1(),  
    DefinitionIdentity = new WorkflowIdentity  
    {  
        Name = "MortgageWorkflow",  
        Version = new Version(1, 0, 0, 0)  
    }  
};  
  
// Add the previous version of the service to the SupportedVersions collection.  
host.SupportedVersions.Add(serviceV1);  
'Create the primary version of the workflow service  
Dim serviceV2 As New WorkflowService  
With serviceV2  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflowV2  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(2, 0, 0, 0) _  
    }  
End With  
  
'Configure the WorkflowServiceHost with the current version  
'of the workflow service. This code requires Administrator  
'privileges to function correctly. If running from Visual  
'Studio, Visual Studio must be run with Administrator privileges.  
  
Dim host As New WorkflowServiceHost(serviceV2, _  
    New Uri("http://localhost:8080/MortgageWorkflowService"))  
  
'Create the previous version of the workflow service.  
Dim serviceV1 As New WorkflowService  
With serviceV1  
    .Name = "MortgageWorkflowService"  
    .Body = New MortgageWorkflowV1  
    .DefinitionIdentity = New WorkflowIdentity With _  
    { _  
        .Name = "MortgageWorkflow", _  
        .Version = New Version(1, 0, 0, 0) _  
    }  
End With  
  
'Add the previous version of the service to the SupportedVersions collection.  
host.SupportedVersions.Add(serviceV1)