Модель рабочего процесса на основе родительских отношений с использованием устойчивого дуплексного режима
Стандартный подход к разработке при реализации рабочего процесса для сложного и длительного процесса заключается в определении частей бизнес-логики, которые могут быть изолированы в меньшие по размеру, более простые и многоразовые рабочие процессы, и последующем координировании их выполнения из главного рабочего процесса. Например, для обработки заказа на покупку можно задать логическую схему поставки в виде рабочего процесса (дочернего), который вызывается из главного рабочего процесса заказа на покупку (родительского), когда это необходимо.
В Windows Workflow Foundation в .NET Framework 4 отсутствуют встроенные компоненты для «вызова» одного длительного рабочего процесса из другого. Однако доступно несколько вариантов реализации, которые позволяют вручную настроить такое поведение. Обсуждение всех доступных вариантов не является целью данного примера, в котором основное внимание уделено одному из наиболее распространенных и общих подходов к реализации шаблона «Call Workflow» (Вызов рабочего процесса) — устойчивого дуплекса, особенно в контексте служб длительных рабочих процессов (рабочих процессов XAMLX). Концепция, лежащая в основе устойчивого дуплекса, очень проста — родительский рабочий процесс выполняет вызов на конечную точку, предоставляемую дочерним рабочим процессом, передавая вместе с сообщением запроса маркер контекста (используемый для корреляции) и адрес обратного вызова. Через некоторое время, когда выполнение дочернего рабочего процесса завершается, он выполняет обратный вызов в родительский рабочий процесс, чтобы уведомить его о завершении работы.
Дополнительные сведения о ручной настройке устойчивого дуплекса можно найти в статье MSDN Устойчивый дуплекс (https://go.microsoft.com/fwlink/?LinkId=196632), а также в связанных примерах WF Пример устойчивого дуплекса (https://go.microsoft.com/fwlink/?LinkId=194430) и Порядок создания службы рабочих процессов, которая вызывает другую службу рабочих процессов.
Основной целью данного примера является предоставление двух настраиваемых действий на основе интерфейса IActivityTemplateFactory; кроме того, он позволяет упростить реализацию устойчивого дуплекса с помощью автоматизации процесса настройки. Действие Workflow Callable Sequence (Последовательность, вызываемая рабочим процессом) используется в дочернем рабочем процессе вместо действий получения и отправки по умолчанию, порождаемых при создании рабочего процесса. Действие Call Workflow Sequence (Последовательность вызова рабочего процесса) используется в родительском рабочем процессе для создания действий и соответствующей конфигурации, требуемой для взаимодействия с дочерним рабочим процессом. Эти действия являются многоразовыми, и их можно добавлять на панель инструментов Visual Studio.
Данный пример состоит из двух решений:
Первое решение (CallWorkflowActivities) содержит два упомянутых выше действия. Чтобы разрешить использование этих действий в конструкторе рабочих процессов Visual Studio Workflow Designer, достаточно скомпилировать решение и добавить действия из результирующей сборки на панель инструментов Visual Studio.
Второе решение (DurableDuplex_with_CallWorkflowActivities) является примером реализации родительского и дочернего рабочих процессов, которые взаимодействуют посредством устойчивого дуплекса, настроенного с использованием действий Workflow Callable Sequence (Последовательность, вызываемая рабочим процессом) и Call Workflow Sequence (Последовательность вызова рабочего процесса).
Примечание
Примеры предназначены только для образовательных целей. Они не предназначены для использования в рабочей среде и не тестировались в ней. Корпорация Майкрософт не предоставляет техническую поддержку для этих примеров.
Необходимые условия
Данное учебное приложение ориентировано на читателей, которые обладают следующими знаниями или навыками:
Базовое знание служб IIS.
Базовые знания о приложениях WCF и Windows Workflow Foundation (WF).
Базовое знание Windows PowerShell.
Базовое знание Microsoft SQL Server.
Кроме того, для запуска решения DurableDuplex_with_CallWorkflowActivities должны быть установлены службы размещения Windows Server AppFabric времени выполнения и настроены следующие компоненты:
Хранилище сохраняемости
Хранилище данных мониторинга
Расположение и файлы примера приложения
Решение 1. CallWorkflowActivities
Имя файла | Описание |
---|---|
CallWorkflowActivities.sln |
Файл решения CallWorkflowActivities |
CallWorkflowActivities |
Папка проекта |
CallWorkflowActivities.csproj |
Файл проекта |
Properties\AssemblyInfo.cs |
Файл со сведениями о сборке |
Activities\WorkflowCallableSequence.cs, Activities \CallWorkflowService.cs |
Исходные файлы для двух действий IActivityTemplateFactory — WorkflowCallableSequence и CallWorkflowService |
UI\CallWorkflowConfiguration.xaml, UI\CallWorkflowConfiguration.xaml.cs, UI\WebConfigContent.xaml, UI\WebConfigContent.xaml.cs, UI\WorkflowCallableSequenceConfiguration.xaml, UI\WorkflowCallableSequenceConfiguration.xaml.cs |
Оформление пользовательского интерфейса и исходные файлы для диалоговых окон, используемых для настройки устойчивого дуплекса |
Code\Helpers.cs |
Исходный код с поддерживающими классами |
Images\requiredBang.gif |
Необходимый файл образа поля |
Решение 2. DurableDuplex_with_CallWorkflowActivities
Имя файла | Описание |
---|---|
DurableDuplex_with_CallWorkflowActivities.sln |
Файл решения DurableDuplex_with_CallWorkflowActivities |
SampleChildService |
Папка проекта для примера дочерней службы |
SampleChildService.csproj |
Файлы проекта для примера дочерней службы |
Properties\AssemblyInfo.cs |
Файл со сведениями о сборке |
ChildWorkflow.xamlx |
Определение рабочего процесса дочерней службы (XAMLX) |
Web.config |
Файл веб-конфигурации для дочерней службы |
SampleParentService |
Папка проекта для примера родительской службы |
SampleParentService.csproj |
Файлы проекта для примера родительской службы |
Properties\AssemblyInfo.cs |
Файл со сведениями о сборке |
ParentWorkflow.xamlx |
Определение рабочего процесса родительской службы (XAMLX) |
Web.config |
Файл веб-конфигурации для родительской службы |
SampleClient |
Папка для клиента тестирования |
SampleClient.csproj |
Файл проекта клиента тестирования |
mainForm.cs, mainForm.Designer.cs, mainForm.resx, Program.cs |
Исходные файлы для главной формы и приложения |
Properties\Resources.Designer.cs, Properties\Resources.resx, Properties\Settings.Designer.cs, Properties\Settings.settings |
Связанные с ресурсами файлы и параметры проекта |
Properties\AssemblyInfo.cs |
Файл со сведениями о сборке |
app.config |
Файл параметров приложения для клиента тестирования |
Настройка данного примера
Запустите Visual Studio 2010 с правами администратора.
Примечание
Данные действия демонстрируют, как построить и развернуть решения CallWorkflowActivities и DurableDuplex_with_CallWorkflowActivities с помощью Visual Studio 2010 и настроить пул приложений для использования с этими службами.
Откройте файл <примеры>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\CallWorkflowActivities.sln, где <примеры> — это путь установки примеров AppFabric.
В меню Построение выберите команду Построить решение. Убедитесь, что построение проекта выполняется без ошибок в окне вывода.
Примечание
Сборка с действиями WorkflowCallableSequence и CallWorkflowService скомпилирована и готова к добавлению на панели инструментов (дополнительные сведения см. в разделе "Выполнение примера").
Откройте файл <примеры>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, где <примеры> — это путь установки примеров AppFabric.
При отображении запросов на создание виртуальных каталогов для проектов SampleParentService и SampleChildService нажмите кнопку Да.
В меню Построение выберите команду Построить решение. Убедитесь, что построение трех проектов выполняется без ошибок в окне вывода.
Запустите диспетчер IIS. Нажмите кнопку Пуск, затем последовательно выберите пункты Все программы, Windows Server AppFabric и Диспетчер служб IIS.
Разверните узел сервера в расположенном слева дереве, а затем щелкните элемент Пулы приложений.
Щелкните правой кнопкой мыши тот пул в списке, в котором будут выполняться примеры служб (можно использовать существующий пул или создать новый), а затем выберите пункт Дополнительные параметры.
Для параметра Версия .NET Framework выберите в раскрывающемся списке значение 4.0 и нажмите кнопку ОК.
В левой панели разверните Сайты и Веб-сайт по умолчанию.
Найдите приложение SampleChildService, щелкните его правой кнопкой мыши и выберите пункт Управление приложением, а затем выберите Дополнительные параметры.
Измените значение параметра Активные протоколы с http на http,net.pipe. *Обратите внимание, что после запятой пробел не ставится.*Нажмите кнопку ОК для подтверждения изменений.
В свойстве Пул приложений выберите пул приложений, настроенный на шаге 9.
Найдите приложение SampleParentService, щелкните его правой кнопкой мыши и выберите пункт Управление приложением, а затем выберите Дополнительные параметры.
Измените значение параметра Активные протоколы с http на http,net.pipe. *Обратите внимание, что после запятой пробел не ставится.*Нажмите кнопку ОК для подтверждения изменений.
В свойстве Пул приложений выберите пул приложений, настроенный на шаге 9.
Примечание
Действия с 13 по 16 добавляют протокол net.pipe в приложения родительской и дочерней служб, что необходимо для управления материализованными экземплярами рабочих процессов.
Запуск примера. Способ 1
Запустите Visual Studio 2010 с правами администратора.
Важно!
Существует два способа запуска данного примера; ниже приведены действия для обоих. Способ 1 предпочтительнее способа 2, поскольку он представляет собой пошаговое сквозное использование действий WorkflowCallableSequence и CallWorkflowService для вызова дочернего рабочего процесса из родительского рабочего процесса, что и является основной целью данного примера, тогда как способ 2 позволяет видеть только итоговое решение: готовую к запуску реализацию устойчивого дуплекса, полностью опускающую процесс проектирования. Дополнительные сведения см. ниже в демонстрационном разделе.
Примечание
Решение CallWorkflowActivities предназначено для улучшения реализации устойчивого дуплекса во время разработки. Поэтому в нем нет запускаемых компонентов. Однако далее приводится пошаговое руководство по использованию указанных действий в простом решении с вызовом дочернего рабочего процесса родительским рабочим процессом.
Создайте новый проект типа WCF Workflow Service Application (Приложение службы рабочего процесса WCF) (шаблон этого проекта находится в типах проектов рабочих процессов) и назовите этот проект ChildService.
Добавление настраиваемых действий примера на панель инструментов: При открытии конструктора WF щелкните правой кнопкой мыши панель инструментов в группе действий Messaging (Обмен сообщениями).
Выберите Выбрать элементы и щелкните вкладку System.Activities Components.
Нажмите кнопку Обзор и перейдите к папке <примеры>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\ CallWorkflowActivities\bin\Debug. Затем выберите сборку CallWorkflowActivities.dll и нажмите кнопку Открыть. (Это сборка, скомпилированная на шаге 3 в разделе «Настройка примера» этого документа.) Обратите внимание на две новые записи в верхней части списка компонентов System.Activities.
Нажмите кнопку ОК для добавления действий CallWorkflowService и WorkflowCallableSequence на панель инструментов. Внешний вид панели инструментов должен быть похож на тот, который приведен на следующем снимке экрана.
Реализация рабочего процесса ChildService: В обозревателе решений переименуйте Service1.xamlx в ChildService.xamlx.
Выберите действие Sequential Service (Последовательная служба) для ChildService в главной области конструирования и нажмите клавишу DELETE.
Перетащите действие WorkflowCallableSequence с панели инструментов на поверхность конструктора WF. При этом открывается диалоговое окно, которое помогает выполнить настройку ChildService как участника сценария устойчивого дуплекса.
Настройка WorkflowCallableSequence: Введите свойства, как показано на следующем снимке экрана, а затем нажмите кнопку "ОК".
Обновление файла web.config: Функционирование реализации устойчивого дуплекса в значительной мере зависит от правильных записей web.config. На экране обновления Web.config автоматически создаются записи, необходимые для файла web.config дочернего рабочего процесса.
Примечание
Файл web.config не обновляется автоматически. В следующем действии выполняется копирование/вставка требуемых записей в файле web.config.
Щелкните Copy to Clipboard & Close (Копировать в буфер и закрыть). При этом выделенные необходимые записи копируются в буфер обмена для вставки в файл web.config. Нажмите кнопку ОК в окне сообщения.
Откройте файл web.config для проекта ChildService и вставьте содержимое буфера обмена (из шага 12) сразу после тега <system.serviceModel>:
... <system.serviceModel> <services> <service name="ChildService"> <endpoint address="" binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceStartWorkflow" /> </service> </services> <client> <endpoint binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceWorkflowCompleted" /> </client> <behaviors> ...
Завершение реализации ChildService: Для простоты в теле данного рабочего процесса задается только значение ответа на запрос (по умолчанию оба являются строками, однако в действительной реализации они могут быть заменены на контракты данных).
Перетащите действие Задержка с панели инструментов на последовательность Тело. Настройте действие Задержка с использованием следующих свойств: Duration = New TimeSpan(0, 2, 0).
Перетащите действие Назначить с панели инструментов на последовательность Тело сразу после последовательности Задержка. Настройте действие Назначить с использованием следующих свойств: To = response; Value = request.
Сохраните проект.
Включение службы для размещения IIS/WAS: Чтобы настроить рабочий процесс для размещения в IIS/WAS и AppFabric, в обозревателе решений щелкните правой кнопкой мыши проект ChildService (не решение) и выберите пункт Свойства.
Выберите третью страницу конфигурации — Веб, а затем в разделе "Серверы" выберите пункт Использовать локальный веб-сервер IIS. Щелкните Создать виртуальный каталог и нажмите кнопку ОК в окне всплывающего сообщения. Сохраните проект.
Создание рабочего процесса ParentService: В обозревателе решений щелкните решение (не проект) правой кнопкой мыши и выберите пункт Добавить>, а затем щелкните Создать проект>. Выберите тип проекта WCF Workflow Service Application (Приложение службы рабочего процесса WCF) и назовите новый проект ParentService. Нажмите кнопку ОК.
В обозревателе решений переименуйте Service1.xamlx в ParentService.xamlx.
Перетащите действие CallWorkflowService с панели инструментов на рабочую область конструирования WF сразу после действия SendResponse. При этом открывается диалоговое окно конфигурации для CallWorkflowService.
Используя кнопку с многоточием, перейдите к определению рабочего процесса ChildService.xamlx, созданного в предыдущих действиях, а затем выберите элемент wsHttpContextBinding в соответствии с протоколом, выбранным в действии 10. Окно конфигурации должно выглядеть так же, как и на следующем снимке экрана.
Примечание
Все параметры для контракта службы запросов/откликов и имен операций автоматически определяются на основании определения дочерней службы.
Нажмите кнопку ОК.
Обновление файла web.config: Открывается диалоговое окно обновления Web.config с записями, необходимыми для подключения к дочерней службе. Обратите внимание, что необходимо ввести реальный адрес дочерней конечной точки, как и адрес конечной точки обратного вызова.
Щелкните Copy to Clipboard & Close (Копировать в буфер и закрыть). При этом выделенные записи web.config копируются в буфер обмена для вставки в файл web.config. Нажмите кнопку ОК в окне всплывающего сообщения.
Откройте файл web.config проекта ParentService и вставьте содержимое буфера обмена сразу после элемента <system.serviceModel>.
Примечание
Обратите внимание на комментарий IMPORTANT в XML — родительская служба также должна предоставлять клиентам конечную точку. Для этого в данном примере можно использовать пример <endpoint>, определенный как часть данного примечания. Файл web.config должен выглядеть следующим образом:
... <system.serviceModel> <services> <service name="Service1"> <endpoint address="" binding="basicHttpBinding" contract="IService" /> <endpoint address="ChildCallback" binding="wsHttpContextBinding" contract="ICallChildService" name="Service1ICallChildServiceWorkflowCompleted" /> </service> </services> <client> <endpoint address="https://localhost/ChildService/ChildService.xamlx" binding="wsHttpContextBinding" bindingConfiguration="Service1ICallChildService_InitCallback" contract="ICallChildService" name="Service1ICallChildServiceStartWorkflow" /> </client> <bindings> <wsHttpContextBinding> <binding name="Service1ICallChildService_InitCallback" clientCallbackAddress="https://localhost/ParentService/ParentService.xamlx/ChildCallback" /> </wsHttpContextBinding> </bindings> <behaviors> <serviceBehaviors> ...
Завершение реализации ParentService: Для вызова дочерней службы родительскому рабочему процессу необходимо передать в вызов службы значения параметров.
Чтобы назначить значение запросу, перетащите действие Назначить с панели инструментов на последовательность Call Workflow (Вызов рабочего процесса) и поставьте его прямо перед действием Отправить запрос. Настройте действие Назначить с использованием следующих свойств: To = request; Value = data.ToString
Сохраните проект.
Включение ParentService для размещения IIS/WAS: Чтобы настроить рабочий процесс для размещения в IIS/WAS и AppFabric, в обозревателе решений щелкните правой кнопкой мыши проект ParentService (не решение) и выберите пункт Свойства.
Выберите третью страницу конфигурации — Веб и в разделе "Серверы" выберите пункт Использовать локальный веб-сервер IIS. Щелкните Создать виртуальный каталог и нажмите кнопку ОК в окне всплывающего сообщения. Сохраните проект.
Выполните построение решения.
Настройка IIS/WAS для размещения устойчивых служб ParentService и ChildService: Запустите диспетчер IIS. Нажмите кнопку "Пуск", затем последовательно выберите пункты "Все программы", "Windows Server AppFabric" и "Диспетчер IIS".
В левой панели разверните Сайты и Веб-сайт по умолчанию.
Найдите приложение ChildService, щелкните его правой кнопкой мыши и выберите пункт Управление приложением, а затем выберите Дополнительные параметры.
Измените значение параметра Активные протоколы с "http" на http,net.pipe. *(Обратите внимание, что после запятой пробел не ставится.)*Нажмите кнопку ОК для подтверждения изменений.
Найдите приложение ParentService, щелкните его правой кнопкой мыши и выберите пункт Управление приложением, а затем выберите Дополнительные параметры.
Измените значение параметра Активные протоколы с "http" на http,net.pipe. *(Обратите внимание, что после запятой пробел не ставится.)*Нажмите кнопку ОК для подтверждения изменений.
Выполните WCFTestClient для запуска экземпляра родительского рабочего процесса. Запустите приложение клиента тестирования WCF, выполнив следующую команду: «C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe» (для 32-разрядных платформ) или «C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe» (для 64-разрядных платформ).
Выберите Добавить->Добавить службу для добавления ссылки на родительскую службу — https://localhost/ParentService/ParentService.xamlx.
После добавления ссылки дважды щелкните метод GetData(), а затем в левой панели введите 123 в качестве значения целочисленного параметра. Щелкните Вызвать.
Используйте панель мониторинга AppFabric для проверки состояния экземпляров ParentService и ChildService. Заметно, что после завершения ChildService родительская служба также завершается, поскольку она получает от дочерней службы уведомление о завершении.
Запуск примера. Способ 2
Запустите Visual Studio 2010 с правами администратора.
Важно!
Существует два способа запуска данного примера; ниже приведены действия для обоих. Способ 1 предпочтительнее способа 2, поскольку он представляет собой пошаговое сквозное использование действий WorkflowCallableSequence и CallWorkflowService для вызова дочернего рабочего процесса из родительского рабочего процесса, что и является основной целью данного примера, тогда как способ 2 позволяет видеть только итоговое решение: готовую к запуску реализацию устойчивого дуплекса, полностью опускающую процесс проектирования. Дополнительные сведения см. ниже в демонстрационном разделе.
Откройте файл <примеры>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, где <примеры> — это путь установки примеров AppFabric.
Убедитесь, что проект SampleClient установлен в качестве запускаемого проекта, — щелкните проект SampleClient правой кнопкой мыши и выберите пункт Назначить запускаемым проектом.
Для запуска примера нажмите клавишу F5. Будет запущено клиентское приложение для тестирования примера.
Щелкните Call Parent Service (Вызов родительской службы).
Просмотрите текст Workflow Instances (Экземпляры рабочих процессов). В нем указываются события запуска и завершения родительского и дочернего рабочих процессов. В данном примере родительский рабочий процесс одновременно запускает три экземпляра дочернего рабочего процесса, используя действие ParallelForEach, и завершается после завершения всех трех дочерних рабочих процессов. Можно также отслеживать запуски экземпляров родительской/дочерней служб с использованием панели мониторинга AppFabric.
Примечание
После запуска дочерний рабочий процесс переходит в спящий режим на две минуты. В это время все родительские и дочерние экземпляры переходят в режим ожидания и материализуются в хранилище сохраняемости. События завершения имеют место после истечения этого двухминутного периода времени.
Удаление примера
Запустите диспетчер IIS. Нажмите кнопку Пуск, затем последовательно выберите пункты Все программы, Windows Server AppFabric и Диспетчер служб IIS.
Разверните узел сервера в расположенном слева дереве,. Разверните Сайты и Веб-сайт по умолчанию.
Щелкните узел SampleChildService и выберите команду Удалить.
Нажмите кнопку Да, чтобы подтвердить удаление выбранного приложения.
Щелкните узел SampleParentService и выберите команду Удалить.
Нажмите кнопку Да, чтобы подтвердить удаление выбранного приложения.
Если были выполнены инструкции для способа 1 из раздела «Выполнение примера», необходимо также выполнить следующие действия:
Щелкните узел ChildService и выберите команду Удалить.
Нажмите кнопку Да, чтобы подтвердить удаление выбранного приложения.
Щелкните узел ParentService и выберите команду Удалить.
Нажмите кнопку Да, чтобы подтвердить удаление выбранного приложения.
Демонстрации
Существует два способа запуска данного примера; ниже приведены действия для обоих. Способ 1 предпочтительнее способа 2, поскольку он представляет собой пошаговое выполнение сквозного использования действий WorkflowCallableSequence и CallWorkflowService для вызова дочернего рабочего процесса из родительского рабочего процесса, что и является основной целью данного примера. Способ 2 демонстрирует только окончательное решение — готовую к запуску реализацию устойчивого дуплекса, в которой проектирование пропускается.
Способ 1 в разделе «Выполнение примера» демонстрирует, как использовать в проекте два настраиваемых действия.
Сначала создается служба дочернего рабочего процесса, действие по умолчанию «Sequential service» (Последовательная служба) удаляется, а затем заменяется на действие WorkflowCallableSequence. WorkflowCallableSequence — это фабрика шаблонов действий, которая на основании вводимых пользователем данных создает и настраивает действия обмена сообщениями (получения и отправки), чтобы они поддерживали корреляцию обратного вызова. Для корреляции обратного вызова контекст запроса должен содержать уникальный маркер контекста, используемый для установления корреляции с родительским рабочим процессом, а также адрес обратного вызова для отправки уведомления о завершении. Действие получения инициализирует дескриптор корреляции обратного вызова из входящего запроса, а действие отправки следует за этим дескриптором для отправки уведомления о завершении назад к родительскому рабочему процессу на динамический адрес обратного вызова, переданный в начальном запросе.
Логическая схема WorkflowCallableSequence также создает записи web.config для службы, конечные точки службы и клиента и любые требуемые записи привязки.
В следующем действии создается родительская служба рабочего процесса. Фабрика шаблонов действий CallWorkflowService запрашивает определение дочернего рабочего процесса, проверяет его конфигурацию и на основании ее создает действия обмена сообщениями (отправка и получение), необходимые для взаимодействия устойчивого дуплекса с дочерним рабочим процессом. Действие отправки инициализирует корреляцию обратного вызова (логически на этом этапе создается уникальный маркер контекста, который передается вместе с запросом в дочерний рабочий процесс), а затем действие получения соотносит уведомления о завершении, возвращаемые от дочернего рабочего процесса с использованием того же маркера контекста (посредством корреляции с дескриптором корреляции, инициализированным во время действия отправки).
Логическая схема CallWorkflowService также создает записи web.config для службы, конечные точки службы и клиента и любые требуемые записи привязки. Обратите внимание на использование атрибута clientCallbackAddress в определении настраиваемой конфигурации привязки. Это адрес, который включается в сообщение отправляемого клиенту запроса, чтобы он мог в динамическом режиме ответить правильному вызывающему объекту (в данном случае родительскому рабочему процессу).
Способ 2 в разделе «Выполнение примера» предоставляет готовое к запуску решение устойчивого дуплекса, которое было реализовано посредством использования WorkflowCallableSequence в дочернем рабочем процессе и CallWorkflowService в родительском рабочем процессе.
Клиент выполняет вызов в родительскую службу, которая параллельно запускает три экземпляра дочерней службы, используя действие ParallelForEach. После получения начального сообщения от родительской службы дочерняя служба на две минуты переходит в спящий режим (используя действие "Задержка"), а по истечении этого периода отправляет уведомление о завершении обратно родительской службе. Родительская служба завершается только после завершения всех экземпляров дочерней службы. И родительский, и дочерний экземпляры заносят записи в журнал событий приложений, используя «Примеры» в качестве источника. Пользовательский интерфейс клиента отслеживает журнал событий приложений для данного источника событий, чтобы отображать события завершения в текстовом поле «Workflow Instances» (Экземпляры рабочих процессов).
2011-12-05