Определите другой стандартный рабочий процесс ServiceHostFactory foreach - PullRequest
2 голосов
/ 20 февраля 2012

Можно ли определить стандартную службу ServiceHostFactory foreach для "рабочего процесса" (xamlx)

Наши клиенты могут создавать собственные рабочие процессы (xamlx), используя собственный конструктор рабочих процессов. Мы заставляем сервисы рабочих потоков иметь привязку WS2007FederationHttpBinding с TransportSecurity. Мы включаем ServiceMetadataBehavior для WorkflowService и, наконец, добавляем DataContractResolver, который выполняет определенное разрешение типов.

СервисХостФабрика

    public class MyServiceHostFactory : WorkflowServiceHostFactory
{
    protected override WorkflowServiceHost CreateWorkflowServiceHost(
        System.ServiceModel.Activities.WorkflowService service,
        Uri[] baseAddresses)
    {
        WorkflowServiceHost host = base.CreateWorkflowServiceHost(service, baseAddresses);

        foreach (Uri adres in baseAddresses)
        {
            if (adres.Scheme == "https")
            {
                WorkflowCreationEndpoint endpoint = new WorkflowCreationEndpoint(
                    new WS2007FederationHttpBinding("IWorkflowService_ws2007FederationHttpBinding"),
                    new EndpointAddress(adres));

                host.AddServiceEndpoint(endpoint);

                PageflowDataContractResolver.AttachDataContractResolver(endpoint);
            }
        }

        var metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
        metadataBehavior.HttpGetEnabled = false;

        host.WorkflowExtensions.Add(new WorkflowInstanceTracking());

        return host;
    }

    public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
    {
        return base.CreateServiceHost(constructorString, baseAddresses);
    }

    protected override WorkflowServiceHost CreateWorkflowServiceHost(System.Activities.Activity activity, Uri[] baseAddresses)
    {            
        return base.CreateWorkflowServiceHost(activity, baseAddresses);
    }
}

Рабочие процессы существуют в базе данных, как писал Рон Джейкоб в этом блоге . «Консультанты» и / или конечные пользователи могут создавать рабочие процессы, используя пользовательский инструмент, но каждый раз, когда они это делают, они не должны забывать добавлять элемент webAcontivation в web.config, который не нужен.

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false">
      <baseAddressPrefixFilters>
        <add prefix="http://localhost" />
      </baseAddressPrefixFilters>
      <serviceActivations>
        <add relativeAddress="~/Workflows/test.xamlx" service="Workflows/test.xamlx" factory="Foo.Bar.MyServiceHostFactory" />
      </serviceActivations>
    </serviceHostingEnvironment>
    <protocolMapping>
        <add scheme="https" binding="ws2007FederationHttpBinding" />
    </protocolMapping>
..

1 Ответ

2 голосов
/ 27 февраля 2012

Я думаю, что было бы правильно перефразировать ваш вопрос как:

Есть ли способ изменить WorkflowServiceHostFactory по умолчанию для веб-приложения, чтобы при активации без конфигурации xamlx вместо меня использовался мой WSHF.

Если я правильно понял ваш вопрос, то не думаю, что есть способ сделать это. У меня был быстрый взгляд, чтобы увидеть, есть ли место, которое вы можете переопределить, но не смогли его увидеть. Другой способ добиться этого - при необходимости изменить web.config, когда пользователь загружает новый рабочий процесс. Редактирование файла web.config в полете должно привести к тому, что любые текущие импульсы выполнения будут обслуживаться существующим доменом приложений, в то время как новый домен приложений создается для обслуживания новых запросов к веб-приложению. Таким образом, не должно происходить потери обработки рабочего процесса. Это, конечно, потребует некоторого тестирования и проверки.

UPDATE Похоже, это возможно. Если вы добавите следующее в ваш файл web.config (который является конфигурацией по умолчанию для активации рабочего процесса).

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="system.xaml.hosting"
                  type="System.Xaml.Hosting.Configuration.XamlHostingSectionGroup,     System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
      <section name="httpHandlers"
               type="System.Xaml.Hosting.Configuration.XamlHostingSection, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </sectionGroup>
  </configSections>

  <system.xaml.hosting>
    <httpHandlers>
      <add xamlRootElementType="System.ServiceModel.Activities.WorkflowService, System.ServiceModel.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
           httpHandlerType="System.ServiceModel.Activities.Activation.ServiceModelActivitiesActivationHandlerAsync, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      <add xamlRootElementType="System.Activities.Activity, System.Activities,     Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
           httpHandlerType="System.ServiceModel.Activities.Activation.ServiceModelActivitiesActivationHandlerAsync, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </httpHandlers>
  </system.xaml.hosting>

</configuration>

Класс ServiceModelActivitiesActivationHandlerAsync, используемый этой конфигурацией по умолчанию, реализован следующим образом:

internal class ServiceModelActivitiesActivationHandlerAsync : ServiceHttpHandlerFactory, IServiceModelActivationHandler
{
    // Methods
    public ServiceHostFactoryBase GetFactory()
    {
        return new WorkflowServiceHostFactory();
    }
}

Затем вместо использования ServiceModelActivitiesActivationHandlerAsync создайте реализацию самостоятельно, которая создает экземпляр своего собственного WorkflowServiceHostFactory в методе GetFactory. Обновите web.config выше, чтобы он указывал на ваш новый httpHandlerType, и все готово.

Я вообще не проверял это. Возможно, IIS не понравится web.config, переопределяющий раздел system.xaml.hosting.

...