Параллельное управление версиями в 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 является допустимым дляWorkflowIdentity, но только одна предыдущая версия службы рабочего процесса может иметь значение DefinitionIdentitynull.WorkflowIdentity

Внимание

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

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

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

  • Обладать тем же Name, что и основная версия службы рабочих процессов.

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

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

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

  • DefinitionIdentity может иметь имя и пакет, отличающиеся от основной версии.

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

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

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

Настройка DefinitionIdentity

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

Снимок экрана: свойство DefinitionIdentity.

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

Примечание.

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

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

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

Снимок экрана, показывающий DefinitionIdentity WorkflowIdentity.

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

Добавление новой версии к самостоятельно размещенной службе рабочих процессов

При добавлении новой версии в резидентную службу Workflow Service WorkflowServiceHost настраивается с основной версией службы Workflow Service, а предыдущие версии должны быть явным образом добавлены в коллекцию SupportedVersions. В следующем примере WorkflowServiceHost настраивается с основной службой Workflow Service, которая использует определение рабочего процесса MortgageWorkflowV2, и в коллекцию MortgageWorkflowV1 добавляется служба Workflow Service, настроенная с определением рабочего процесса SupportedVersions. Каждая служба рабочего процесса настроена с уникальным 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)