5

Web アプリケーションの 1 つで、Autofac を使用する Web サービスを使用しています。svc ファイルは次のとおりです。

<%@ ServiceHost Language="C#" Debug="true" 
Service="MyApp.WebServices.Contracts.Interfaces.IMyWebService, MyApp.WebServices.Contracts" 
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" %>

次のように、Web サービス アプリケーションの依存関係を登録します。

public class IocConfig
{        
    public static void RegisterDependencies()
    {
        var builder = new ContainerBuilder();            

        //web services
        builder.RegisterType<MyWebService>().As<IMyWebService>().InstancePerLifetimeScope();

        var container = builder.Build();

        AutofacHostFactory.Container = container;            
    }
}

別の Web アプリケーションから、これらのサービスにも Autofac を使用して接続したいので、次のような依存関係を登録します。

public class IocConfig
{
    //Ioc dependencies for frontend application
    public static void RegisterDependencies()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly);

        builder.RegisterModule<AutofacWebTypesModule>();

        builder
            .Register(c => new ChannelFactory<ISomeWebService>(
                new BasicHttpBinding(),
                new EndpointAddress("http://localhost/MyApp.WebServices/MyWebService.svc")))
            .InstancePerLifetimeScope();

        //register service proxies
        builder.Register(c => c.Resolve<ChannelFactory<IMyWebService>>().CreateChannel())
            .As<IMyWebService>()
            .UseWcfSafeRelease();

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

コントローラーの 1 つの中で、次のことを行います。

public SomeController(IMyWebService myServiceProxy) 
    {
        _myServiceProxy = myServiceProxy;

        var response =_myServiceProxy.CallSomeMethod(new Request()
        {
            EmailAddress = "test@test.com"
        });
    }

タイプ IMyWebService の myServiceProxy が解決されています。透過プロキシであることがわかりますが、「CallSomeMethod」を呼び出すとエラーが発生します。

「AutofacWebRequest」に一致するタグを持つスコープは、インスタンスが要求されたスコープからは見えません。これは通常、HTTP ごとのリクエストとして登録されたコンポーネントが、SingleInstance() コンポーネント (または同様のシナリオ) によってリクエストされていることを示します。Web 統合では、常に DependencyResolver.Current または ILifetimeScopeProvider.RequestLifetime から依存関係をリクエストし、コンテナー自体からは決してリクエストしません。 .

ここで何が間違っていますか?ありがとう!

4

1 に答える 1

9

ドキュメントによると、WCF は要求ごとの有効期間スコープをサポートしていません。サービスの実装が依存関係を取得している場合、要求に従ってそれらを登録することはできません。

これをトラブルシューティングする方法と使用できる代替手段を説明する FAQ があります。

于 2015-04-06T03:03:31.257 に答える