我有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)
似乎NInject要么没有正确注册以解决任何问题,要么无法解决任何控制器类型。从MVC3的源代码来看,这是对Activator.CreateInstance
的调用,显示在堆栈跟踪中;
return (IController)(_resolverThunk().GetService(controllerType) ??
Activator.CreateInstance(controllerType));
换句话说,除非控制器不能被NInject正确解析,否则它根本不会调用Activator.CreateInstance
。
换句话说,您应该停止在控制器中寻找问题,并开始检查NInject注册。最简单的第一步是创建一个带有默认构造函数的愚蠢的控制器,在构造函数中设置一个断点,然后查看堆栈跟踪是否反映构造函数正在被NInject调用。
从上面的Joachim身上吸取教训:
仅仅定义ninectcontrollerfactory是不够的,你还必须确保在global.asax.cs
中注册了控制器。我得到了同样的问题-即Ninject类是在Project>Infrastructure>NinjectControllerFactory.cs中定义的,但在编译和导航到简单路由时没有遇到断点。以下行必须添加到Application_Start()中:
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
验证被注入的类是抽象的。此类型的类不能实例化。