2

「ワークフロー」サービス (xamlx) ごとに標準の ServiceHostFactory を定義することは可能ですか?

お客様は、カスタム ワークフロー デザイナーを使用して独自のワークフロー (xamlx) を作成できます。ワークフロー サービスに、TransportSecurity を使用した WS2007FederationHttpBinding を強制します。WorkflowService の ServiceMetadataBehavior を有効にし、最後に何らかの型解決を行う DataContractResolver を追加します。

ServiceHostFactory

    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 を指すようにします。

私はこれをまったくテストしていません。web.config が system.xaml.hosting セクションを上書きすることを IIS が好まない可能性があります。

于 2012-02-27T09:42:54.773 に答える