【问题标题】:MVC 3 Exception: Make sure that the controller has a parameterless public constructorMVC 3 异常:确保控制器具有无参数的公共构造函数
【发布时间】: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


【解决方案1】:

似乎 NInject 要么未正确注册以解决任何问题,要么无法解析您的任何控制器类型。从 MVC3 的源代码来看,这是在堆栈跟踪中显示的对 Activator.CreateInstance 的调用;

return (IController)(_resolverThunk().GetService(controllerType) ??
                     Activator.CreateInstance(controllerType));

换句话说,它根本不会调用Activator.CreateInstance,除非控制器不能被NInject正确解析。

换句话说,您可能应该停止在控制器中寻找问题,并开始检查 NInject 注册。最简单的第一步是使用默认构造函数制作一个愚蠢的控制器,在构造函数中设置断点并查看堆栈跟踪反映 NInject 正在调用构造函数。如果不是,NInject 没有正确注册。

【讨论】:

  • 感谢您的回复。构造函数中的断点不会被命中。
  • @GordonHickley 即使在您的测试控制器上使用无参数构造函数也不行?仍然得到相同的堆栈跟踪?
【解决方案2】:

背负上面的约阿希姆:

定义 NInjectControllerFactory 是不够的,你还必须确保在 global.asax.cs 中注册控制器

我遇到了同样的问题 - 即 Ninject 类是在 Project>Infrastructure>NinjectControllerFactory.cs 中定义的,但在编译和导航到简单路由时没有遇到断点。必须在 Application_Start() 中添加以下行:

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

【讨论】:

    【解决方案3】:

    验证注入的类是抽象的。 这种类型的类不能实例化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多