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

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

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

Рабочие процессы, которые не являются службами рабочих процессов, должны быть размещены в службах IIS/WAS. Это может оказаться полезным, если нужно разместить рабочий процесс, разработанный кем-то другим. Например, если необходимо повторно разместить конструктор рабочих процессов и разрешить пользователям создавать собственные рабочие процессы. Размещение не являющихся службами рабочих процессов в службах IIS обеспечивает поддержку таких функций, как перезапуск процессов, завершение работы при ожидании, наблюдение за работоспособностью процессов и активация на основе сообщений. Службы рабочих процессов, размещенные в службах IIS, содержат действия Receive и активируются в момент получения сообщения службами IIS. Не являющиеся службами рабочие процессы не содержат действий обмена сообщениями и по умолчанию не могут быть активированы отправкой сообщения. Чтобы создать экземпляр рабочего процесса, необходимо создать класс, производный от WorkflowHostingEndpoint, и определить контракт службы, содержащий операции. В этом разделе подробно рассматривается создание простого рабочего процесса, определение контракта службы, который может быть использован клиентом для активации рабочего процесса, а затем создание класса, производного от WorkflowHostingEndpoint, использующего контракт службы для прослушивания запросов на создание рабочего процесса.

Создание простого рабочего процесса

Создайте новое пустое решение в среде Visual Studio 2010 под названием CreationEndpointTest .

Добавьте в него новый проект служебного приложения рабочего процесса WCF под названием SimpleWorkflow . Откроется конструктор рабочих процессов.

Удалите действия ReceiveRequest и SendResponse. Это как раз те действия, которые делают рабочий процесс службой. Поскольку мы не работаем со службами рабочих процессов, они нам не нужны.

Установите свойство DisplayName действия последовательности в значение «Sequential Workflow».

Переименуйте файл Service1.xamlx в Workflow1.xamlx.

Щелкните конструктор за пределами действия последовательности и задайте для свойств Name и ConfigurationName значение «Workflow1».

Перетащите действие WriteLine в раздел Sequence. Действие WriteLine можно найти в разделе Базовые функции области элементов. Задайте для свойства Text действия WriteLine значение «Hello, world».

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

Создайте контракт службы создания рабочего процесса

Добавьте новый проект библиотеки классов с названием Shared в решение CreationEndpointTest .

Добавьте в проект Shared ссылки на сборки System.ServiceModel.dll, System.Configuration и System.ServiceModel.Activities.

Переименуйте файл Class1.cs в IWorkflowCreation.cs и вставьте в него следующий код.

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

Создайте класс, производный от WorkflowHostingEndpoint

Добавьте новый класс с названием CreationEndpoint , производный от WorkflowHostingEndpoint, в проект Shared .

Добавьте локальную статическую переменную типа Uri с именем defaultBaseUri в класс CreationEndpoint .

Добавьте следующий конструктор в класс CreationEndpoint . Обратите внимание, что в вызове конструктора базового класса указан контракт службы IWorkflowCreation .

Добавьте следующий конструктор по умолчанию в класс CreationEndpoint .

Добавьте статическое свойство DefaultBaseUri в класс CreationEndpoint . Это свойство будет использоваться для хранения базового URI по умолчанию, если он не указан.

Создайте следующий метод для получения привязки по умолчанию, используемой для конечной точки создания.

Переопределите метод OnGetInstanceId, чтобы он возвращал идентификатор экземпляра рабочего процесса. Если заголовок Action заканчивается на «Create», возвращается пустой идентификатор GUID; если заголовок Action заканчивается на «CreateWithInstanceId», возвращается идентификатор GUID, переданный в метод. В противном случае формируется исключение InvalidOperationException. Эти заголовки Action соответствуют двум операциям, определенным в контракте службы IWorkflowCreation .

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

Создайте элемент стандартной конечной точки, чтобы получить возможность настройки WorkflowCreationEndpoint.

Добавьте ссылку на класс Shared в проект CreationEndpoint .

Добавьте новый класс с именем CreationEndpointElement , производный от StandardEndpointElement, в проект CreationEndpoint . Этот класс будет представлять CreationEndpoint в файле web.config.

Добавьте свойство EndpointType , возвращающее тип конечной точки.

Переопределите метод CreateServiceEndpoint для возврата нового CreationEndpoint .

Переопределите методы OnApplyConfiguration, OnApplyConfiguration, OnInitializeAndValidate и OnInitializeAndValidate. Эти методы нужно просто определить, не нужно заполнять их каким-либо кодом.

Добавьте класс коллекции для CreationEndpoint в файл CreationEndpointElement.cs в проекте CreationEndpoint . Этот класс используется конфигурацией для хранения числа экземпляров CreationEndpoint в файле web.config.

Выполните построение решения.

Размещение рабочего процесса в службах IIS

Создайте в службах IIS новое приложение с именем MyCreationEndpoint .

Скопируйте файл workflow1.xaml, созданный конструктором рабочих процессов, в каталог приложения и переименуйте его в workflow1.xamlx.

Скопируйте файлы shared.dll и CreationEndpoint.dll в каталог bin приложения (создайте этот каталог, если он отсутствует).

Замените содержимое файла Web.config в проекте CreationEndpoint следующим кодом.

После элемента <system.web> зарегистрируйте CreationEndpoint , добавив следующий код конфигурации.

Этот код зарегистрирует класс CreationEndpointCollection , чтобы можно было настроить CreationEndpoint в файле web.config.

Добавьте элемент <service> (после тега </extensions>) с атрибутом CreationEndpoint , который будет прослушивать входящие сообщения.

Добавьте элемент <behaviors> (после тега </services>), чтобы включить метаданные службы.

Скопируйте файл web.config в каталог приложения IIS.

Проверьте, работает ли создание конечной точки, запустив Internet Explorer и прейдя по адресу https://localhost/MyCreationEndpoint/Workflow1.xamlx. Internet Explorer должен отобразить следующий экран.

Создайте клиента, который будет вызывать CreationEndpoint.

Добавьте новое консольное приложение в решение CreationEndpointTest .

Добавьте ссылки на сборки System.ServiceModel.dll, System.ServiceModel.Activities и проект Shared .

В методе Main создайте ChannelFactory типа IWorkflowCreation и вызовите метод CreateChannel. Будет возвращена учетная запись-посредник. Затем можно вызвать метод Create этой учетной записи-посредника, чтобы создать экземпляр рабочего процесса, размещенного в службах IIS:

Запустите приложение CreationEndpointClient. Его вывод должен выглядеть следующим образом.

Пример

Ниже приведен полный код для этого образца.

Данный пример может показаться неправильным, потому что в нем не реализована служба, реализующая интерфейс IWorkflowCreation . Это было автоматически сделано в методе CreationEndpoint .

📎📎📎📎📎📎📎📎📎📎