2012-07-13 49 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描述的一样。