如何为IIS托管的WCF服务上的所有操作添加OperationBehavior?

时间:2013-02-15 12:07:19

标签: wcf iis operation wcf-behaviour

我有一个自定义的OperationBehavior。我想立即将它应用于所有操作。 遗憾的是,无法在整个服务或web.config中配置OperationBehaviors。

在测试应用程序中托管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在任何操作开始之前都不可用,所以我的方法失败了。

2 个答案:

答案 0 :(得分: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

获取有关服务主机工厂的更多信息

答案 1 :(得分:1)

最后,我找到了另一种解决方案:使用合同行为,根据需要注入任何其他behvaior。像这样:

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方法可以留空。您可能还希望将ApplyClientBehavior方法与ApplyDispatchBehavior方法中的相同代码一起使用。