2015-04-05 1 views
0

В одном из моих веб-приложений у меня есть веб-служба, использующая Autofac, файл svc выглядит следующим образом:Ошибка автофокусировки - с областью действия, в которой был запрошен экземпляр, не видно области с тегом соответствия «AutofacWebRequest»

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

зарегистрировать зависимости для моего приложения веб-службы, как это:

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

с другой веб-приложения, я хочу, чтобы подключиться к этим услугам также с помощью 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)); 
    } 
} 

Внутри одного из контроллеров, я следующее:

public SomeController(IMyWebService myServiceProxy) 
    { 
     _myServiceProxy = myServiceProxy; 

     var response =_myServiceProxy.CallSomeMethod(new Request() 
     { 
      EmailAddress = "[email protected]" 
     }); 
    } 

myServiceProxy типа IMyWebService решается, я вижу, что это прозрачный прокси-сервер, но когда я называю «CallSomeMethod» Я получаю сообщение об ошибке:

Никакой области с тегом, соответствующим «AutofacWebRequest», видны из области, в которой запрашивался экземпляр. Это обычно указывает на то, что компонент, зарегистрированный в качестве HTTP-запроса, запрашивается компонентом SingleInstance() (или аналогичным сценарием). В рамках веб-интеграции всегда запрашиваются зависимости от DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, никогда из самого контейнера ,

Что я здесь делаю неправильно? Благодаря!

ответ

4

Per the docs, WCF doesn't support per-request lifetime scope. Если ваша реализация службы принимает зависимости, вы не можете зарегистрировать их в соответствии с запросом.

There is an FAQ telling you how to troubleshoot this and alternatives you can use.

+0

изменил мою жизнь зависимостей от InstancePerRequest к InstancePerLifetimeScope и теперь он работает. Благодаря! – lex87

+0

Кроме того, моя фабрика сеансов NHibernate по-прежнему является жизненным циклом SingleInstance, и она работает, проблема в том, что это действительно с InstancePerRequest. – lex87

Смежные вопросы