2013-02-15 59 views
1

我有一个自定义的OperationBehavior。我想立即将其应用于所有操作。 不幸的是,OperationBehaviors无法在整个服务或web.config中配置。如何为IIS托管的WCF服务上的所有操作添加OperationBehavior?

当在测试应用托管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

您可以使用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

0

获得有关服务主机工厂的详细信息,在我找到一个替代的解决方案结束:使用中注入任何其他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方法可以留空。您可能还想使用ApplyDispatchBehavior方法中相同代码的ApplyClientBehavior方法。