Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
WorkflowIdentity предоставляет разработчикам приложений рабочих процессов способ связать имя и Version с определением рабочего процесса, а также связать эти сведения с сохраненным экземпляром рабочего процесса. Эти идентификационные данные могут быть использованы разработчиками приложений рабочего процесса для поддержки таких сценариев, как параллельное выполнение нескольких версий определения рабочего процесса, и являются ключевым элементом для других функциональных возможностей, таких как динамическое обновление. В этом разделе представлены общие сведения об использовании WorkflowIdentity с хостингом WorkflowApplication. Сведения о параллельном выполнении определений рабочих процессов в службе рабочих процессов см. в разделе "Параллельное управление версиями" в WorkflowServiceHost. Сведения о динамическом обновлении см. в разделе "Динамическое обновление".
В этом разделе
Использование WorkflowIdentity
Чтобы использовать WorkflowIdentity, создайте экземпляр, настройте его и свяжите с экземпляром WorkflowApplication. В экземпляре WorkflowIdentity содержатся три элемента информации для идентификации. Name и Version содержат имя и Version и являются обязательными, а Package является необязательным и может использоваться для указания дополнительной строки с информацией (например, именем сборки или другими полезными сведениями). WorkflowIdentity уникален, если какое-либо из его трех свойств отличается от другого WorkflowIdentity.
Внимание
Экземпляр WorkflowIdentity не должен содержать никакой персонально идентифицируемой информации (PII). Сведения об объекте WorkflowIdentity, используемом для создания экземпляра, передаются средой выполнения всем настроенным службам отслеживания на различных этапах жизненного цикла действия. WF Tracking не имеет механизма для сокрытия персональных данных (конфиденциальных пользовательских данных). Поэтому экземпляр 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 пытается выполнить любые операции сохранения, использующие новые функции версионирования в базе данных сохранения, которая не была обновлена с помощью предоставленного скрипта, выдается исключение с сообщением, аналогичным следующему.
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'.
Обновление схемы базы данных
Откройте SQL Server Management Studio и подключитесь к серверу базы данных сохраняемости, например .\SQLEXPRESS.
Выберите "Открыть", "Файл" в меню "Файл". Перейдите в следующую папку:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\enВыберите SqlWorkflowInstanceStoreSchemaUpgrade.sql и нажмите кнопку "Открыть".
Выберите имя базы данных сохраняемости в раскрывающемся списке "Доступные базы данных ".
Выберите "Выполнить" в меню "Запрос ".
По завершении запроса обновляется схема базы данных, и при желании можно просмотреть идентификатор рабочего процесса по умолчанию, который был назначен сохраняемым экземплярам рабочих процессов. Разверните базу данных постоянства в узле «Базы данных» в Обозревателе объектов, а затем разверните узел «Представления». Щелкните правой кнопкой мыши System.Activities.DurableInstancing.Instances и выберите "Лучшие 1000 строк". Прокрутите до конца столбцов и обратите внимание, что в представление добавлены шесть дополнительных столбцов: IdentityName, IdentityPackage, Build, Major, Minor и Revision. Все сохраненные рабочие процессы будут иметь значение NULL для этих полей, представляющее удостоверение рабочего процесса NULL .