2

カスタムのOperationBehaviorがあります。一度にすべての操作に適用したいと思います。残念ながら、OperationBehaviorsは、サービス全体またはweb.configで構成することはできません。

テストアプリケーションでWCFサービスをホストする場合、次のことができます。

        foreach (var ep in _serviceHost.Description.Endpoints)
        {
            foreach (OperationDescription od in ep.Contract.Operations)
            {
                od.Behaviors.Add(new MyOperationBehavior());
            }
        }

        _serviceHost.Open();

しかし、IISでホストされているWebアプリケーションでそれを行うにはどうすればよいですか?

乗り込もうとしOperationContext.Current.Host.Description.EndpointsましApplication_Startたが、もちろんOperationContext.Current操作開始前に利用できないので、アプローチが失敗します。

4

2 に答える 2

5

あなたはそれをするために使うことができますServiceHostFactory。これを使用すると、サービスを開く前にOMにアクセスできます。

これは例です:

public class MyFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
        foreach (var ep in host.Description.Endpoints)
        {
            foreach (OperationDescription od in ep.Contract.Operations)
            {
                od.Behaviors.Add(new MyOperationBehavior());
            }
        }

        return host;
    }
}

また、サービスホストファクトリの詳細については、http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/14/wcf-extensibility-servicehostfactory.aspxを参照してください。

于 2013-02-15T17:46:51.113 に答える
1

最後に、私は別の解決策を見つけました。必要に応じて他の動作を注入するコントラクト動作を使用します。このような:

public class InjectAllOperationsBehavior : Attribute, IContractBehavior
{
    private IOperationBehavior _operationBehavior = null;

    public InjectAllOperationsBehavior(Type operationBehaviorType)
    {
        _operationBehavior = 
            (IOperationBehavior)Activator.CreateInstance(operationBehaviorType);
    }

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
    {
        foreach (OperationDescription opDescription in contractDescription.Operations)
        {
            opDescription.Behaviors.Add(_operationBehavior);
        }
    }

...他のIContractBehaviorメソッドは空のままにすることができます。ApplyDispatchBehaviorメソッドと同じコードでApplyClientBehaviorメソッドを使用することもできます。

于 2013-02-18T08:50:26.583 に答える