3

我的 WCF 项目中有几个 Web 服务需要自定义ServiceAuthorizationManager才能对 OAuth 调用进行身份验证。为此,我创建了一个自定义WebServiceHostFactory. 我正在连接 Ninject 并且很难将其转换为NinjectWebServiceHostFactory. 这是我的代码:

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();
    }
}

当我切换WebServiceHost到 aNinjectWebServiceHost时,它要求IServiceBehavior执行。ServiceBehavior我的Web 服务上有一个属性,ServiceBehavior我的web.config.

有没有人看到这一点并能够成功实施这样的事情?有没有更好的方法来为我的 2 个 Web 服务连接它?我不希望这影响我所有的 Web 服务。

4

2 回答 2

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 上实现这个特定的工厂。

于 2012-07-14T03:51:40.420 回答
-1

我相信您必须创建一个自定义属性来自己实现IServiceBehavior接口

您的ApplyDispatchBehavior方法实现将看起来像这样:

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接口实现,该实现依赖于 Ninject 为DispatchRuntime.

Peter De Rycke在他的博客文章“使用 IoC 容器创建 WCF 服务实例”中进一步介绍了它(注意上面的代码取自那里)。

我想如果你仍然想使用 a NinjectWebServiceHost,你可以通过一个IServiceBehavior很像彼得上面概述的实现。

于 2012-07-13T18:05:17.183 回答