2

是否可以为每个“工作流”服务(xamlx)定义标准的 ServiceHostFactory

我们的客户可以使用自定义工作流设计器制作自己的工作流 (xamlx)。我们强制工作流服务使用带有 TransportSecurity 的 WS2007FederationHttpBinding。我们为 WorkflowService 开启 ServiceMetadataBehavior,最后添加一个 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);
    }
}

正如 Ron Jacob在此博客中所写,工作流存在于数据库中。“顾问”和/或最终用户可以使用自定义工具创建工作流,但每次他们都不能忘记在 web.config 中添加不需要的 serviceActivation 元素。

<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>
..
4

1 回答 1

2

我认为将您的问题改写为:

有没有办法更改 Web 应用程序的默认 WorkflowServiceHostFactory,以便无需配置的 xamlx 激活将使用我的 WSHF。

如果我正确理解了您的问题,那么我认为没有办法做到这一点。我快速浏览了一下是否有可以覆盖它的地方,但看不到任何地方。实现此目的的另一种方法是在用户上传新工作流时根据需要修改 web.config。在运行中编辑 web.config 应该会导致现有 AppDomain 为任何当前运行的执行脉冲提供服务,同时创建一个新的 AppDomain 来为 Web 应用程序的新请求提供服务。因此,不应发生工作流处理的丢失。这当然需要一些测试和验证。

更新 看起来这可能是可能的。如果将以下内容添加到 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,而是自己提供一个实现,该实现在 GetFactory 方法中实例化您自己的 WorkflowServiceHostFactory。更新上面的 web.config 以指向您的新 httpHandlerType,您应该完成了。

我根本没有测试过这个。IIS 可能不喜欢覆盖 system.xaml.hosting 部分的 web.config。

于 2012-02-27T09:42:54.773 回答