繁体   English   中英

Autofac:网站重新启动后,ComponentNotRegisteredException

[英]Autofac : ComponentNotRegisteredException after web site restart

我有一个奇怪的错误。 将DLL上传到bin文件夹后,我的网站正常工作。

但是,在离开它一段时间后(或从共享主机控制面板触发网站重新启动)

我收到以下错误

The requested service 'Nop.Core.Data.DataSettings' has not been registered. To avoid  this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.


[ComponentNotRegisteredException: The requested service 'Nop.Core.Data.DataSettings'  has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.]
   Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) +231
   Autofac.ResolutionExtensions.Resolve(IComponentContext context, IEnumerable`1 parameters) +118
   Autofac.ResolutionExtensions.Resolve(IComponentContext context) +75
   Nop.Core.Infrastructure.DependencyManagement.ContainerManager.Resolve(String key) +156
   Nop.Core.Infrastructure.NopEngine.Resolve() +110
   Nop.Data.EfStartUpTask.Execute() +94
   Nop.Core.Infrastructure.NopEngine.RunStartupTasks() +806
   Nop.Core.Infrastructure.NopEngine.Initialize(NopConfig config) +90
   Nop.Web.MvcApplication.Application_Start() +494[/i]

有人对如何解决此问题有任何想法吗?

谢谢

应用重启似乎导致某些问题想要解析未注册的类型。 堆栈跟踪显示某种启动任务正在运行,并且该任务正在尝试解析Nop.Core.Data.DataSettings类型。

首先,尝试查找Nop.Core.Data.DataSettings类型在Nop.Core.Data.DataSettings中注册的位置。 您应该在代码中的某处看到看起来像...的行。

builder.RegisterType<DataSettings>();

也就是说,应该使用Autofac.ContainerBuilder注册DataSettings类型。 如果该行在任何地方都不存在,则需要添加它以便注册类型。 Autofac不仅会“自动”解析未注册的类型。 (或者,您可以在AnyConcreteTypeNotAlreadyRegisteredSource注册AnyConcreteTypeNotAlreadyRegisteredSource,但这通常是多余的。)

如果找不到该行 ,则需要添加它。 取决于您的应用程序的位置,但是您应该看到其他在Autofac上进行注册的地方-这也可能是个好地方。

如果DataSettings已被注册 ,则意味着您的应用程序重启并不一定总是以相同的顺序执行启动动作,或者甚至没有一直执行相同的启动动作。 如果您有在应用程序启动时运行的代码(例如HttpModule )无法正确处理多个工作进程或未正确处理线程,则可能会发生这种情况。

另一个潜在的(但不是可能的)情况是,您的应用程序中运行了两个Autofac容器,而DataSettings位于其中一个中,而DataSettings在其中。 这确实是边缘案例,但有可能。

接下来,查看堆栈跟踪中的所有代码。 弄清楚正在尝试解决DataSettings对象的问题。 可能无法直接解决。 它可能是构造函数对正在解决的其他问题的依赖。 您将必须认真研究代码才能弄清楚。

无论如何,这看起来像是应用程序启动问题,而不是Autofac问题。 Autofac不只是“丢失”注册-如果它抱怨您要解决未注册的问题,那么它就没有注册。

异常消息告诉您调试它所需要知道的所有信息 -解决问题的位置,寻找的内容...您需要打开应用程序代码,查看堆栈跟踪中显示的实际执行路径,以及查看解决的问题,时间和原因,以便找出解决方法。

听起来您需要使用BuildManager.GetReferencedAssemblies()来加载程序集,以确保在回收AppDomain之后加载它们。

我过去曾针对类似问题发布过详细信息:

Web.Config上的Autofac丢失注册编辑

我将在此方面向Autofac Wiki添加一些注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM