2012-07-13 71 views
3

我的WCF項目中有幾個Web服務需要自定義ServiceAuthorizationManager才能夠驗證OAuth調用。爲此,我創建了一個自定義WebServiceHostFactory。我正在連接Ninject,並且很難將其轉換爲NinjectWebServiceHostFactory。這裏是我的代碼:Ninject - 創建自定義NinjectWebServiceHost

public class MyServiceHostFactory : WebServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     return new MyServiceHost(serviceType, baseAddresses); 
    } 
} 

public class MyServiceHost: WebServiceHost 
{ 
    public MyServiceHost(Type serviceType, Uri[] baseAddresses) 
     : base(serviceType, baseAddresses) 
    { 
     Authorization.ServiceAuthorizationManager = new OAuthAuthorizationManager(); 
    } 
} 

當我切換WebServiceHostNinjectWebServiceHost,它要求一個IServiceBehavior實現。我在我的網絡服務上有ServiceBehavior屬性,我的web.config中有一個ServiceBehavior部分。

有沒有人看到這個,並能夠成功實現這樣的事情?有沒有更好的方法來爲我的2個Web服務進行連接?我不希望這會影響我的所有Web服務。

回答

1

我們在前些天做了這個。我們發現實現一種新型的NinjectWebServiceHostFactory更容易,它爲我們連接了自定義的AuthorizationManager。

public class OAuthHostFactory : NinjectWebServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     var host = base.CreateServiceHost(serviceType, baseAddresses); 
     host.Authorization.ServiceAuthorizationManager = new OAuthAuthorizationManager(); 
     return host; 
    } 
} 

這給了我們選擇和選擇我們想要實現這個特定工廠的路線或svc的靈活性。

-1

我相信你必須創建一個自定義屬性,它自己實現IServiceBehavior interface

ApplyDispatchBehavior method實施會想看看是這樣的:

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, 
    ServiceHostBase serviceHostBase) 
{ 
    Type serviceType = serviceDescription.ServiceType; 
    IInstanceProvider instanceProvider = new NinjectInstanceProvider(
     new StandardKernel(), serviceType); 

    foreach(ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers) 
    { 
     foreach (EndpointDispatcher endpointDispatcher in dispatcher.Endpoints) 
     { 
      DispatchRuntime dispatchRuntime = endpointDispatcher.DispatchRuntime; 
      dispatchRuntime.InstanceProvider = instanceProvider; 
     } 
    } 
} 

基本上,你創建一個自定義IInstanceProvider interface實現依賴於Ninject以創建DispatchRuntime實例。

Peter De Rycke進一步在他的blog entry "Using an IoC container to create WCF service instances"進一步(注意上面的代碼是從那裏取得的)。

我想如果你仍然想使用NinjectWebServiceHost,你可以通過一個IServiceBehavior實現,就像上面Peter描述的一樣。