2013-02-15 58 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方法。