【发布时间】:2013-06-12 10:29:11
【问题描述】:
我有 this 有同样问题的 MVC 3 应用程序。我使用 Ninject 进行依赖注入。我无法追踪哪个控制器有问题,它昨天坏了,我花了一整天的时间试图定位。应用程序中有 60 多个控制器。无法捕获或调试异常,跟踪也无法提供有关有问题的源控制器的任何有意义的线索。如果不引发此异常,则无法访问任何控制器的任何操作。
有谁知道如何确定有问题的实际控制人?
谢谢
内部异常:
System.MissingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean
noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)
堆栈跟踪:
at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<BeginProcessRequest>b__2()
at System.Web.Mvc.SecurityUtil.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a()
at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 func)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
【问题讨论】:
-
No action for any controller can be accessed without this exception being thrown.。听起来您在 every 控制器中注入的东西或在所有控制器中使用的操作过滤器已损坏(即缺少依赖项)。单个损坏的控制器不应破坏您的整个系统。 -
嗯,这可能没什么,因为我不确定如果堆栈跟踪实际上是使用 NInject 来解析控制器会是什么样子,但对我来说,它看起来像是使用默认激活器而不是N注入。您确定 NInject 已正确注册?
-
是的,绝对不使用 Ninject。请参阅内部异常中的行
System.Activator.CreateInstance -
感谢您的回复。我们将其追溯到自最近构建以来未部署的 Ninject 程序集。拥有 FileNotFoundException 而不是这个无参数的构造函数异常会更有帮助。
-
可能发生的情况是 Ninject 无法创建控制器并将
null返回到DefaultControllerFactory。在这种情况下,Ninject 返回null,因为IDependencyResolver合约要求它这样做。在这种情况下,控制器工厂会退回到默认行为,即使用Activator.CreateInstance。解决方案是:验证 Ninject 是否可以创建系统中的每个控制器。在自动化测试中或在应用程序启动期间执行此操作。这是related question about Web API。 MVC 具有与 Web API 相似的架构。
标签: asp.net-mvc-3 dependency-injection ninject