Поделиться через


Как включить сохраняемость SQL для рабочих процессов и служб рабочих процессов

Данный раздел относится к версии Windows Workflow Foundation 4.

В данном разделе описано, как настроить функцию хранилища экземпляров рабочих процессов SQL для включения сохраняемости рабочих процессов и служб рабочих процессов программно и с помощью файла конфигурации. Перед использованием функции хранилища экземпляров рабочих процессов SQL необходимо создать базу данных, которая используется функцией для сохранения экземпляров рабочих процессов. Программа установки .NET Framework 4 копирует файлы скрипта SQL, связанные с функцией хранилища экземпляров рабочих процессов SQL, в папку %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN. Выполните эти файлы скрипта в базе данных SQL Server 2005 или SQL Server 2008, которая должна использоваться в хранилище экземпляров рабочих процессов SQL для сохранения экземпляров рабочих процессов. Сначала запустите файл SqlWorkflowInstanceStoreSchema.sql, а затем файл SqlWorkflowInstanceStoreLogic.sql.

Ee395773.note(ru-ru,VS.100).gifПримечание
Чтобы очистить базу данных сохраняемости для получения вновь подготовленной базы данных, примените сценарии в каталоге %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN в следующем порядке.

  1. SqlWorkflowInstanceStoreSchema.sql

  2. SqlWorkflowInstanceStoreLogic.sql

Ee395773.Important(ru-ru,VS.100).gif Примечание
Если база данных сохраняемости не создана, то при попытке узла сохранить рабочие процессы хранилище экземпляров рабочих процессов SQL вырабатывает исключение, подобное следующему.

System.Data.SqlClient.SqlException: не удается найти хранимую процедуру System.Activities.DurableInstancing.CreateLockOwner

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

Включение сохраняемости для резидентных рабочих процессов, которые используют WorkflowApplication

Можно включить сохраняемость для резидентных рабочих процессов, которые программно используют WorkflowApplication с помощью объектной модели SqlWorkflowInstanceStore. Шаги, необходимые для выполнения этой задачи, содержатся в следующей процедуре.

Включение сохраняемости для резидентных рабочих процессов

  1. Добавьте ссылку на «System.Activites.DurableInstancing.dll».

  2. Добавьте следующий оператор в начало исходного файла после существующих инструкций using.

    using System.Activities.DurableInstancing;
    
  3. Создайте объект SqlWorkflowInstanceStore и назначьте его свойству InstanceStore приложения WorkflowApplication, как показано в следующем примере кода.

    SqlWorkflowInstanceStore store = 
        new SqlWorkflowInstanceStore("Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI");
    
    WorkflowApplication wfApp =
        new WorkflowApplication(new Workflow1());
    
    wfApp.InstanceStore = store;
    
    Ee395773.note(ru-ru,VS.100).gifПримечание
    В строке подключения могут указываться различные имена серверов в зависимости от выпуска SQL Server.

  4. Вызовите метод Persist объекта WorkflowApplication, чтобы сохранить рабочий процесс, или метод Unload, чтобы сохранить и выгрузить рабочий процесс. Можно также обрабатывать событие PersistableIdle, вызванное объектом WorkflowApplication, и возвращать соответствующий элемент (Persist или Unload) действия PersistableIdleAction.

    wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
    {
        return PersistableIdleAction.Persist;
    };
    
Ee395773.note(ru-ru,VS.100).gifПримечание
Образец Сохранение приложения рабочего процесса в разделе Сохраняемость иллюстрирует включение сохраняемости для рабочих процессов с помощью объекта SqlWorkflowInstanceStore, а пошаговые инструкции приведены в разделе Как создать и запустить длительно выполняющийся рабочий процесс документа Учебник по началу работы.

Включение сохраняемости для резидентных служб рабочих процессов, которые используют WorkflowServiceHost

Можно включить сохраняемость для резидентных служб рабочих процессов, которые программно используют WorkflowServiceHost с помощью класса SqlWorkflowInstanceStoreBehavior или класса DurableInstancingOptions.

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

В следующем списке перечислены этапы использования класса SqlWorkflowInstanceStoreBehavior для включения сохраняемости для резидентных служб рабочих процессов.

Включение сохраняемости с помощью SqlWorkflowInstanceStoreBehavior

  1. Добавьте ссылку на System.ServiceModel.dll.

  2. Добавьте следующий оператор в начало исходного файла после существующих инструкций using.

    using System.ServiceModel.Activities.Description;
    
  3. Создайте экземпляр WorkflowServiceHost и добавьте конечные точки для службы рабочего процесса.

    WorkflowServiceHost host = new WorkflowServiceHost(new CountingWorkflow(), new Uri(hostBaseAddress));
    host.AddServiceEndpoint("ICountingWorkflow", new BasicHttpBinding(), "");
    
  4. Создайте объект SqlWorkflowInstanceStoreBehavior и задайте свойства объекта поведения.

    SqlWorkflowInstanceStoreBehavior instanceStoreBehavior = new SqlWorkflowInstanceStoreBehavior(connectionString);
    instanceStoreBehavior.HostLockRenewalPeriod = new TimeSpan(0, 0, 5);
    instanceStoreBehavior.InstanceCompletionAction = InstanceCompletionAction.DeleteAll;
    instanceStoreBehavior.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry;
    instanceStoreBehavior.InstanceEncodingOption = InstanceEncodingOption.GZip;
    instanceStoreBehavior.RunnableInstancesDetectionPeriod = new TimeSpan("00:00:02");
    host.Description.Behaviors.Add(instanceStoreBehavior);
    
  5. Откройте узел службы рабочего процесса.

    host.Open();
    
Ee395773.Important(ru-ru,VS.100).gif Примечание
Образец Встроенная конфигурация в разделе Сохраняемость можно использовать как пример включения сохраняемости для служб рабочих процессов с помощью класса SqlWorkflowInstanceStoreBehavior.

Использование свойства DurableInstancingOptions

После применения поведения SqlWorkflowInstanceStoreBehavior хранилищу DurableInstancingOptions.InstanceStore на WorkflowServiceHost задается значение объекта SqlWorkflowInstanceStore, созданного с использованием значений конфигурации. Эти же действия можно выполнить программно, чтобы задать свойство DurableInstancingOptions узла WorkflowServiceHost без использования класса SqlWorkflowInstanceStoreBehavior, как показано в следующем примере кода.

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;

Включение сохраняемости для размещенных на WAS служб рабочих процессов, которые используют WorkflowServiceHost, с помощью файла конфигурации

Можно включить сохраняемость для резидентных или размещенных на WAS служб рабочих процессов с помощью файла конфигурации. Служба рабочих процессов, размещенная на WAS, использует WorkflowServiceHost, так же как это делают резидентные службы рабочих процессов.

SqlWorkflowInstanceStoreBehavior — поведение службы, которое позволяет удобно изменять свойства Хранилище экземпляров рабочих процессов SQL с помощью конфигурации XML. Для служб рабочих процессов, размещенных на WAS, используется файл Web.config. В следующем примере конфигурации показано, как настроить хранилище экземпляров рабочих процессов SQL с помощью элемента поведения sqlWorkflowInstanceStore в файле конфигурации.

<serviceBehaviors>
    <behavior name="">
        <sqlWorkflowInstanceStore 
                    connectionString="Data Source=(local);Initial Catalog=DefaultPersistenceProviderDb;Integrated Security=True;Async=true"
                    instanceEncodingOption="GZip | None"
                    instanceCompletionAction="DeleteAll | DeleteNothing"
                    instanceLockedExceptionAction="NoRetry | BasicRetry |AggressiveRetry"
                    hostLockRenewalPeriod="00:00:30" 
                    runnableInstancesDetectionPeriod="00:00:05">

        <sqlWorkflowInstanceStore/>
    </behavior>
</serviceBehaviors>

Если не заданы значения свойства connectionString или connectionStringName, хранилище экземпляров рабочих процессов SQL использует строку подключения по умолчанию DefaultSqlWorkflowInstanceStoreConnectionString.

После применения поведения SqlWorkflowInstanceStoreBehavior хранилищу DurableInstancingOptions.InstanceStore на WorkflowServiceHost задается значение объекта SqlWorkflowInstanceStore, созданного с использованием значений конфигурации. Эти же действия можно выполнить программно для использования SqlWorkflowInstanceStore с WorkflowServiceHost (без использования элемента поведения службы).

workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;
Ee395773.security(ru-ru,VS.100).gif Примечание o безопасности.
В файле Web.config не рекомендуется сохранять конфиденциальные сведения, такие как имена и пароли пользователей. При сохранении в файле Web.config конфиденциальных сведений необходимо обеспечить защиту доступа к файлу Web.config с помощью списков управления доступом файловой системы. Также можно обеспечить защиту значений конфигурации в файле конфигурации, как указано в разделе Шифрование сведений о конфигурации с помощью функции защищенной конфигурации.

Элементы Machine.config, связанные с функцией хранилища экземпляров рабочих процессов SQL

Установка .NET Framework 4 добавляет к файлу Machine.config следующие элементы, связанные с функцией хранилища экземпляров рабочих процессов SQL:

  • Добавляет к файлу Machine.config следующий элемент расширения поведения, который обеспечивает возможность использования элемента поведения службы <sqlWorkflowInstanceStore> в файле конфигурации для настройки сохраняемости служб.

    <configuration>
        <system.serviceModel>
            <extensions>
                <behaviorExtensions>
                    <add name="sqlWorkflowInstanceStore" type="System.Activities.DurableInstancing.SqlWorkflowInstanceStoreElement, System.Activities.DurableInstancing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
                </behaviorExtensions>
            </extensions>
        <system.serviceModel>
    <configuration>