Параллельное управление версиями в WorkflowServiceHost

Параллельное WorkflowServiceHost управление версиями, представленное в платформа .NET Framework 4.5, обеспечивает возможность размещения нескольких версий службы рабочего процесса на одной конечной точке. Предоставляемая функциональность параллельной работы позволяет настроить службу Workflow Service таким образом, чтобы новые экземпляры службы Workflow Service создавались с использованием нового определения рабочего процесса, а запущенные экземпляры завершались с использованием существующего определения. Данный раздел содержит общие сведения о параллельном выполнении служб Workflow Services с использованием WorkflowServiceHost.

Размещение нескольких версий в службе Workflow Service

WorkflowServiceHost содержит два свойства, которые можно настроить для разрешения параллельного выполнения нескольких версий рабочего процесса: SupportedVersions и DefinitionIdentity. SupportedVersions содержит поддерживаемые версии службы Workflow Service, а DefinitionIdentity используется для уникальной идентификации каждой службы Workflow Service. Для этого нужно связать WorkflowIdentity со службой Workflow Service. В WorkflowIdentity содержится три элемента информации для идентификации. Name и Version содержат имя и Version и являются обязательными, а Package является необязательным и может использоваться для указания дополнительной строки с информацией (например, именем сборки или другими полезными сведениями). Каждая служба Workflow Service, содержащаяся в коллекции SupportedVersions, должна иметь уникальный WorkflowIdentity. WorkflowIdentity уникален, если какое-либо из его трех свойств отличается от другого WorkflowIdentity. Значение nullявляется допустимым дляDefinitionIdentity, но только одна предыдущая версия службы рабочего процесса может иметь значениеnullWorkflowIdentity.WorkflowIdentity

Внимание

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

Правила размещения нескольких версий службы Workflow Service

При добавлении пользователем дополнительной версии на WorkflowServiceHost существует несколько условий, которые необходимо выполнить для размещения службы Workflow Service с одним и тем же описанием и набором конечных точек. Если одна из дополнительных версий не выполняет эти условия, WorkflowServiceHost возвращает исключение при вызове Open. Каждое определение рабочего процесса, предоставленное узлу в качестве дополнительной версии, должно выполнять следующие требования (где основной версией является определение службы Workflow Service, предоставленное конструктору узла). Дополнительная версия рабочего процесса должна:

  • иметь одинаковый Name с основной версией службы Workflow Service.

  • Не должна содержать действий Receive или SendReply в своем Body, которых нет в основной версии, и они должны соответствовать контракту операции.

  • Иметь уникальный DefinitionIdentity. Только одно определение рабочего процесса может содержать nullDefinitionIdentity.

Некоторые изменения разрешены. Следующие элементы могут различаться между версиями:

  • DefinitionIdentity может иметь Name и Package, отличные от основной версии.

  • Значение AllowBufferedReceive может отличаться от основной версии.

  • ConfigurationName может отличаться от основной версии.

  • ImplementedContracts может отличаться от основной версии.

Настройка DefinitionIdentity

При создании службы рабочего процесса с помощью конструктора DefinitionIdentity рабочих процессов устанавливается окно "Свойства ". Щелкните вне корневого действия службы в конструкторе, чтобы выбрать службу рабочего процесса и выберите окно свойств в меню "Вид". Выберите WorkflowIdentity из раскрывающегося списка, который отображается рядом со свойством DefinitionIdentity, а затем разверните и укажите нужные WorkflowIdentity свойства. В следующем примере DefinitionIdentity настроено значениеMortgageWorkflowNameи значение Version1.0.0.0. Package является необязательным и в данном примере равняется null.

Screenshot that shows the DefinitionIdentity property.

Если служба Workflow Service размещается резидентно, DefinitionIdentity настраивается при построении службы Workflow Service. В следующем примере DefinitionIdentity настроены те же значения, что и предыдущий пример, с NameMortgageWorkflow использованием и значения Name1.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 требуется, хотя только одна версия службы рабочего процесса может иметь значение NULLDefinitionIdentity.

Примечание.

Это полезно, если служба изначально была развернута без настроенного DefinitionIdentity, а после этого создается обновленная версия.

Добавление новой версии к службе Workflow Service, размещенной на веб-сервере

Первым шагом в настройке новой версии службы Workflow Service в службе, размещенной на веб-сервере, является создание новой папки в папке App_Code, которая имеет то же имя, что и файл службы. Если файл xamlx службы имеет имя MortgageWorkflow.xamlx, необходимо присвоить папке имя MortgageWorkflow. Поместите копию файла xamlx изначальной службы в эту папку и присвойте ему другое имя, например MortgageWorkflowV1.xamlx. Внесите желаемые изменения в основную службу, обновите ее DefinitionIdentity, затем разверните службу. В следующем примере DefinitionIdentity был обновлен с помощью Name, равного MortgageWorkflow, и с Version, равной 2.0.0.0.

Screenshot that shows DefinitionIdentity of WorkflowIdentity.

При повторном запуске службы предыдущая версия автоматически добавится в коллекцию SupportedVersions, так как она находится в указанной подпапке App_Code. Обратите внимание, что если основная версия службы рабочего процесса имеет nullDefinitionIdentity предыдущие версии, не будут добавлены. В одной версии null может быть равен DefinitionIdentity, но, если имеется несколько таких версий, основная версия не должна быть с null, равным DefinitionIdentity, в противном случае предыдущие версии не будут добавлены в коллекцию SupportedVersions.

Добавление новой версии к службе Workflow Service, размещенной резидентно

При добавлении новой версии в резидентную службу Workflow Service WorkflowServiceHost настраивается с основной версией службы Workflow Service, а предыдущие версии должны быть явным образом добавлены в коллекцию SupportedVersions. В следующем примере WorkflowServiceHost настраивается с основной службой Workflow Service, которая использует определение рабочего процесса MortgageWorkflowV2, и в коллекцию MortgageWorkflowV1 добавляется служба Workflow Service, настроенная с определением рабочего процесса SupportedVersions. Каждая служба Workflow Service настраивается с уникальным DefinitionIdentity, отражающим версию определения рабочего процесса.

// 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)