我有一个奇怪的错误。我将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]
任何人都知道如何解决这个问题?
由于
答案 0 :(得分:6)
看起来app重启导致某些事情要解决未注册的类型。堆栈跟踪显示正在运行某种启动任务,并且该任务正在尝试解析类型Nop.Core.Data.DataSettings
。
首先,尝试查找使用Autofac注册Nop.Core.Data.DataSettings
类型的位置。您应该在代码中的某处看到类似于......的行
builder.RegisterType<DataSettings>();
也就是说,DataSettings
类型应该在Autofac.ContainerBuilder
注册。如果该行在任何地方都不存在,则需要添加该行以便注册该类型。 Autofac不仅“自动”解析未注册的类型。 (或者,您可以使用Autofac注册AnyConcreteTypeNotAlreadyRegisteredSource
,但这通常有点过分。)
如果找不到该行,则需要添加该行。哪里取决于你的申请,但是你应该看到一些其他地方的东西已经注册了Autofac - 这也可能是放置它的好地方。
如果DataSettings
已经注册,那么这意味着您的应用程序重启并不总是以相同的顺序执行启动操作,或者甚至不执行相同的启动操作每时每刻。如果你有在app启动时运行的代码(比如在HttpModule
中),它不能正确处理多个工作进程或者没有正确处理线程,就会发生这种情况。
另一个可能(但不太可能)的情况是,您的应用程序中运行了两个Autofac容器,而DataSettings
位于其中一个容器中,而不是另一个容器。这真的是边缘情况,但它是可能的。
接下来,查看堆栈跟踪中的所有代码。找出试图解析DataSettings
对象的内容。它可能无法直接解决;它可能是一个构造函数依赖于其他已经解决的东西。你将不得不插入代码来解决它。
无论如何,这看起来像应用启动问题而不是Autofac问题。 Autofac不只是“失去”注册 - 如果它抱怨你试图解决一些未注册的东西......那么它就没有注册。
异常消息告诉您调试它需要知道的一切 - 解决方案正在发生的地方,它正在寻找...你需要破解你的应用程序代码,看看堆栈跟踪中显示的实际执行路径,并查看解决了什么,何时以及为什么这样您可以弄清楚如何解决它。
答案 1 :(得分:4)
听起来您需要使用BuildManager.GetReferencedAssemblies()
加载程序集,以确保在回收AppDomain后加载它们。
我在过去发布了类似问题的详细信息:
Autofac Losing Registrations on Web.Config Edit
我将在Autofac维基上添加一些关于此的注释。