是否可以为每个“工作流”服务(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 wrote in this blog 。 “顾问”和/或最终用户可以使用自定义工具创建工作流程,但每次这样做时,他们都不能忘记在 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>
..
最佳答案
我认为将您的问题改写为正确的:
有没有办法更改 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 可能不喜欢 web.config 覆盖 system.xaml.hosting 部分。
关于wcf - 为每个工作流程定义不同的默认 ServiceHostFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9362307/