3

私の WCF プロジェクトには、ServiceAuthorizationManagerOAuth 呼び出しを認証できるカスタムを必要とする Web サービスがいくつかあります。これを行うために、カスタム を作成しました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を aに切り替えるNinjectWebServiceHostと、実装が求められIServiceBehaviorます。Web サービスにServiceBehavior属性がありServiceBehaviorweb.config.

誰かがこれを見て、このようなものをうまく実装できましたか? これを 2 つの Web サービスに接続するためのより良いルートはありますか? これがすべての Web サービスに影響することを望んでいません。

4

2 に答える 2

1

先日これをやっただけです。カスタムAuthorizationManagerを接続する新しいタイプのNinjectWebServiceHostFactoryを実装する方が簡単であることがわかりました。

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

基本的には、Ninject に依存して のインスタンスを作成するカスタムIInstanceProviderインターフェイスDispatchRuntime実装を作成しています。

Peter De Ryckeは、彼のブログ エントリ「IoC コンテナーを使用して WCF サービス インスタンスを作成する」でさらに詳しく説明しています(上記のコードはそこから取られたことに注意してください)。

それでも a を使用したい場合は、ピーターが上で概説したものと同じような実装NinjectWebServiceHostを渡すことができると思います。IServiceBehavior

于 2012-07-13T18:05:17.183 に答える