Usar WorkflowIdentity y el control de versiones

WorkflowIdentity proporciona una manera para que los desarrolladores de aplicaciones de flujo de trabajo asocien un nombre y una Version con una definición de flujo de trabajo, y para que esta información se asocie a una instancia de flujo de trabajo persistente. Los desarrolladores de aplicaciones de flujo de trabajo pueden usar esta información de identidad para habilitar escenarios como la ejecución en paralelo de varias versiones de una definición de flujo de trabajo; además esta información proporciona la piedra angular para otras funcionalidades como la actualización dinámica. Este tema proporciona información general sobre cómo usar WorkflowIdentity con hospedaje de WorkflowApplication. Para información sobre la ejecución en paralelo de definiciones de flujo de trabajo en un servicio de flujo de trabajo, consulte Control de versiones en paralelo en WorkflowServiceHost. Para más información sobre la actualización dinámica, consulte Actualización dinámica.

En este tema

Usar WorkflowIdentity

Para usar WorkflowIdentity, cree una instancia, configúrela y asóciela con una instancia de WorkflowApplication. Una instancia de WorkflowIdentity contiene tres elementos de identificación de informació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. WorkflowIdentity es único si cualquiera de sus tres propiedades son diferentes de otra WorkflowIdentity.

Importante

Un objeto WorkflowIdentity no debe contener información de identificación personal (PII). 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.

En el ejemplo siguiente, se crea una WorkflowIdentity y se asocia a una instancia de un flujo de trabajo creado mediante una definición de flujo de trabajo de MortgageWorkflow.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

Al recargar y al reanudar un flujo de trabajo, se debe usar una WorkflowIdentity configurada para coincidir con la WorkflowIdentity de la instancia de flujo de trabajo persistente.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

Si la WorkflowIdentity usada al recargar la instancia de flujo de trabajo no coincide con la WorkflowIdentity persistente, se producirá VersionMismatchException. En el ejemplo siguiente se realiza un intento de carga en la instancia de MortgageWorkflow que se ha hecho persistente en el ejemplo anterior. Este intento de carga se realiza mediante una WorkflowIdentity configurada para una versión más reciente del flujo de trabajo de hipotecas que no coincide con la instancia persistente.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

Cuando se ejecuta el código anterior, se produce la VersionMismatchException siguiente.

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

Ejecución en paralelo mediante WorkflowIdentity

WorkflowIdentity se puede usar para facilitar la ejecución de varias versiones de un flujo de trabajo en paralelo. Un escenario común es cambiar los requisitos comerciales de un flujo de trabajo de ejecución prolongada. Pueden ejecutarse varias instancias de un flujo de trabajo cuando se implementa una versión actualizada. La aplicación host se puede configurar para usar la definición de flujo de trabajo actualizada al iniciar nuevas instancias y es responsabilidad de la aplicación host proporcionar la definición de flujo de trabajo correcta al reanudar las instancias. WorkflowIdentity puede usarse para identificar y proporcionar la definición de flujo de trabajo coincidente al reanudar instancias de flujo de trabajo.

Para recuperar la WorkflowIdentity de una instancia de flujo de trabajo persistente, se usa el método GetInstance. El método GetInstance toma el Id de la instancia de flujo de trabajo persistente y el SqlWorkflowInstanceStore que contiene la instancia persistente y devuelve una WorkflowApplicationInstance. WorkflowApplicationInstance contiene información sobre una instancia de flujo de trabajo persistente, incluida su WorkflowIdentity asociada. El host puede usar esta WorkflowIdentity asociada para proporcionar la definición de flujo de trabajo correcta al cargar y reanudar la instancia de flujo de trabajo.

Nota

Un objeto WorkflowIdentity NULL es válido y el host puede usarlo para asignar las instancias persistentes sin ningún WorkflowIdentity asociado a la definición de flujo de trabajo adecuada. Este escenario puede darse cuando una aplicación de flujo de trabajo no se escribió al principio con el control de versiones del flujo de trabajo o cuando una aplicación se actualiza desde .NET Framework 4. Para más información, consulte Actualizar las bases de datos de persistencia de .NET Framework 4 para admitir el control de versiones de flujo de trabajo.

En el ejemplo siguiente, se usa una Dictionary<WorkflowIdentity, Activity> para asociar instancias de WorkflowIdentity con sus definiciones de flujo de trabajo coincidentes, y se inicia un flujo de trabajo mediante la definición de flujo de trabajo de MortgageWorkflow, que está asociada a identityV1WorkflowIdentity.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

En el ejemplo siguiente, la información sobre la instancia de flujo de trabajo persistente del ejemplo anterior se recupera mediante una llamada a GetInstance y la información persistente de WorkflowIdentity se usa para recuperar la definición de flujo de trabajo coincidente. Esta información se usa para configurar WorkflowApplication y después se carga el flujo de trabajo. Tenga en cuenta que como se usa la sobrecarga de Load que toma WorkflowApplicationInstance, la SqlWorkflowInstanceStore usa el WorkflowApplicationInstance configurado en WorkflowApplication y por tanto no es necesario configurar su propiedad InstanceStore.

Nota

Si se establece la propiedad InstanceStore, debe estar establecida con la misma instancia de SqlWorkflowInstanceStore usada por WorkflowApplicationInstance o se producirá una ArgumentException con el mensaje siguiente: The instance is configured with a different InstanceStore than this WorkflowApplication..

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

Actualizar las bases de datos de persistencia de .NET Framework 4 para admitir el control de versiones de flujo de trabajo

Se proporciona un script de base de datos SqlWorkflowInstanceStoreSchemaUpgrade.sql para actualizar las bases de datos de persistencia creadas mediante los scripts de base de datos de .NET Framework 4. Este script actualiza las bases de datos para admitir las funciones nuevas de control de versiones presentadas en .NET Framework 4.5. Cualquier instancia de flujo de trabajo persistente en las bases de datos recibe valores de control de versión predeterminados y puede participar en ejecuciones en paralelo y en actualizaciones dinámicas.

Si una aplicación de flujo de trabajo de .NET Framework 4.5 intenta cualquier operación de persistencia que use las características nuevas de control de versiones en una base de datos de persistencia que no se haya actualizado mediante el script proporcionado, se produce una InstancePersistenceCommandException con un mensaje similar al siguiente.

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

Para actualizar el esquema de la base de datos

  1. Abra SQL Server Management Studio y conéctese al servidor de base de datos de persistencia, por ejemplo .\SQLEXPRESS.

  2. Elija Abrir, Archivo en el menú Archivo. Busque la siguiente carpeta: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Seleccione SqlWorkflowInstanceStoreSchemaUpgrade.sql y haga clic en Abrir.

  4. Seleccione el nombre de la base de datos de persistencia en la lista desplegable Bases de datos disponibles.

  5. Elija Ejecutar en el menú Consulta.

Cuando la consulta se completa, el esquema de la base de datos se actualiza y, si lo desea, puede ver la identidad de flujo de trabajo predeterminada que se asignó a las instancias de flujo de trabajo persistentes. Expanda la base de datos de persistencia en el nodo Bases de datos del Explorador de objetos y, a continuación, expanda el nodo Vistas. Haga clic con el botón derecho en System.Activities.DurableInstancing.Instances y elija Seleccionar las primeras 1000 filas. Desplácese al final de las columnas y observe que hay seis columnas adicionales agregadas a la vista: IdentityName, IdentityPackage, Build, Major, Minor y Revision. Todos los flujos de trabajo persistentes tendrán un valor de NULL para estos campos, que representa una identidad de flujo de trabajo NULL.