Использование WorkflowIdentity и управления версиями

WorkflowIdentity предоставляет разработчикам приложений рабочих процессов способ связать имя и Version с определением рабочего процесса, а также связать эти сведения с сохраненным экземпляром рабочего процесса. Эти идентификационные данные могут быть использованы разработчиками приложений рабочего процесса для поддержки таких сценариев, как параллельное выполнение нескольких версий определения рабочего процесса, и являются ключевым элементом для других функциональных возможностей, таких как динамическое обновление. В этом разделе представлены общие сведения об использовании WorkflowIdentity с размещением WorkflowApplication. Сведения о параллельном выполнении определений рабочих процессов в службе рабочих процессов см. в разделе "Параллельное управление версиями" в WorkflowServiceHost. Сведения о динамическом обновлении см. в разделе "Динамическое обновление".

В этом разделе

Использование WorkflowIdentity

Чтобы использовать WorkflowIdentity, создайте экземпляр, настройте его и свяжите с экземпляром WorkflowApplication. В экземпляре WorkflowIdentity содержатся три элемента информации для идентификации. Name и Version содержат имя и Version и являются обязательными, а Package является необязательным и может использоваться для указания дополнительной строки с информацией (например, именем сборки или другими полезными сведениями). WorkflowIdentity уникален, если какое-либо из его трех свойств отличается от другого WorkflowIdentity.

Внимание

Экземпляр WorkflowIdentity не должен содержать персональные данные (PII). Сведения об объекте WorkflowIdentity, используемом для создания экземпляра, передаются средой выполнения всем настроенным службам отслеживания на различных этапах жизненного цикла действия. Отслеживание WF не имеет механизмов, позволяющих скрывать персональные данные (конфиденциальные пользовательские данные). Поэтому экземпляр WorkflowIdentity не должен содержать никаких персональных данных, так как они будут передаваться средой выполнения в записях отслеживания и могут отображаться любому пользователю с доступом к записям отслеживания.

В следующем примере создается WorkflowIdentity и связывается с экземпляром рабочего процесса, созданного с использованием определения рабочего процесса 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();

При повторной загрузке и возобновлении рабочего процесса необходимо использовать WorkflowIdentity, который настроен так, чтобы соответствовать WorkflowIdentity сохраненного экземпляра рабочего процесса.

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...

Если WorkflowIdentity используется, когда заново загружаемый экземпляр рабочего процесса не соответствует сохраненному WorkflowIdentity, выдается исключение VersionMismatchException. В следующем примере предпринимается попытка загрузки для экземпляра MortgageWorkflow, который был сохранен в предыдущем примере. Эта попытка загрузки выполняется с помощью WorkflowIdentity, настроенного для более новой версии рабочего процесса ипотеки, не соответствующей сохраненному экземпляру.

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...

Если предыдущий код выполняется, выдается исключение VersionMismatchException.

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.

Параллельное выполнение с помощью WorkflowIdentity

Метод WorkflowIdentity можно использовать, чтобы облегчить параллельное выполнение нескольких версий рабочего процесса. Одним из типичных сценариев является изменение бизнес-требований в длительном рабочем процессе. Несколько экземпляров рабочего процесса могут выполняться при развертывании обновленной версии. Ведущее приложение можно настроить для использования обновленного определения рабочего процесса при запуске новых экземпляров. Обязанностью ведущего приложения является предоставление правильного определения рабочего процесса при возобновлении экземпляров. WorkflowIdentity можно использовать для определения и предоставления соответствующего определения рабочего процесса при возобновлении экземпляров рабочего процесса.

Для получения WorkflowIdentity сохраненного экземпляра рабочего процесса используется метод GetInstance. Метод GetInstance принимает Id сохраненного экземпляра рабочего процесса и SqlWorkflowInstanceStore, который содержит сохраненный экземпляр и возвращает WorkflowApplicationInstance. Объект WorkflowApplicationInstance содержит сведения о сохраненном экземпляре рабочего процесса, включая связанный с ним WorkflowIdentity. Связанный объект WorkflowIdentity может использоваться ведущим приложением, чтобы указать правильное определение рабочего процесса при загрузке и возобновлении экземпляра рабочего процесса.

Примечание.

Значение NULL для WorkflowIdentity допустимо и может использоваться основным приложением для сопоставления экземпляров, которые были сохранены без связанного объекта WorkflowIdentity в правильном определении рабочего процесса. Этот сценарий может произойти, если приложение рабочего процесса изначально не было написано с использованием управления версиями рабочих процессов или когда приложение обновляется с платформа .NET Framework 4. Дополнительные сведения см. в статье об обновлении платформа .NET Framework 4 базы данных сохраняемости для поддержки управления версиями рабочих процессов.

В следующем примере Dictionary<WorkflowIdentity, Activity> используется для связывания WorkflowIdentity экземпляров с соответствующими определениями рабочих процессов, а рабочий процесс запускается с помощью MortgageWorkflow определения рабочего процесса, связанного с 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();

В следующем примере сведения о сохраненном экземпляре рабочего процесса из предыдущего примера возвращаются путем вызова метода GetInstance и сохраненные данные WorkflowIdentity используются для получения соответствующего определения рабочего процесса. Эти сведения используются для настройки WorkflowApplication, а затем загружается рабочий процесс. Обратите внимание, что, поскольку используется перегрузка Load, принимающая WorkflowApplicationInstance, SqlWorkflowInstanceStore, который настроен на WorkflowApplicationInstance, используется WorkflowApplication и, следовательно, его свойству InstanceStore не нужно задавать значение.

Примечание.

Если свойство InstanceStore имеет значение, то его необходимо установить на один и тот же экземпляр SqlWorkflowInstanceStore, используемый WorkflowApplicationInstance, иначе будет создаваться исключение ArgumentException со следующим сообщением: 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...

Обновление платформа .NET Framework 4 баз данных сохраняемости для поддержки управления версиями рабочих процессов

Скрипт базы данных SqlWorkflowInstanceStoreSchemaUpgrade.sql предоставляется для обновления баз данных сохраняемости, созданных с помощью скриптов базы данных платформа .NET Framework 4. Этот скрипт обновляет базы данных для поддержки новых возможностей управления версиями, представленных в платформа .NET Framework 4.5. Все сохраняемые экземпляры рабочих процессов в базах данных получают значения управления версиями по умолчанию и затем могут участвовать в параллельном выполнении и динамическом обновлении.

Если приложение рабочего процесса платформа .NET Framework 4.5 пытается выполнить любые операции сохраняемости, использующие новые функции управления версиями в базе данных сохраняемости, которая не была обновлена с помощью предоставленного скрипта, InstancePersistenceCommandException создается сообщение, аналогичное следующему сообщению.

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'.

Обновление схемы базы данных

  1. Откройте SQL Server Management Studio и подключитесь к серверу базы данных сохраняемости, например .\SQLEXPRESS.

  2. Выберите "Открыть", "Файл" в меню "Файл". Перейдите в следующую папку: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Выберите SqlWorkflowInstanceStoreSchemaUpgrade.sql и нажмите кнопку "Открыть".

  4. Выберите имя базы данных сохраняемости в раскрывающемся списке "Доступные базы данных ".

  5. Выберите "Выполнить" в меню "Запрос ".

По завершении запроса обновляется схема базы данных, и при желании можно просмотреть идентификатор рабочего процесса по умолчанию, который был назначен сохраняемым экземплярам рабочих процессов. Разверните базу данных сохраняемости в узле "Базы данных" обозреватель объектов, а затем разверните узел "Представления". Щелкните правой кнопкой мыши System.Activities.DurableInstancing.Instances и выберите "Лучшие 1000 строк". Прокрутите до конца столбцов и обратите внимание, что в представление добавлены шесть дополнительных столбцов: IdentityName, IdentityPackage, Build, Major, Minor и Revision. Все сохраненные рабочие процессы будут иметь значение NULL для этих полей, представляющее удостоверение рабочего процесса NULL .