2

我有一个自定义的 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.EndpointsApplication_Start但在任何操作开始之前当然OperationContext.Current不可用,所以我的方法失败了。

4

2 回答 2

5

你可以使用 aServiceHostFactory来做到这一点。有了它,您可以在服务打开之前访问 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 方法可以留空。您可能还希望将 ApplyClientBehavior 方法与 ApplyDispatchBehavior 方法中的相同代码一起使用。

于 2013-02-18T08:50:26.583 回答