ASP.NET MVC 1: «Нет конструктора без параметров» — ошибка после перехода на VS2010 (с использованием MVCTurbines)

#.net #asp.net-mvc #turbine

#.net #asp.net-mvc #турбина

Вопрос:

Наш текущий проект написан на ASP.NET MVC 1 с использованием mvc-turbines (и unity) для IOC / DI.

Когда я пытаюсь запустить приложение с 2008 года, все работает нормально, но с 2010 года я продолжаю получать ошибку «Нет конструктора без параметров».

Почему? Оба нацелены на одно и то же .Net framework. Решение VS 2010 продолжает использовать фабрику контроллеров по умолчанию. Есть предложения по отладке этого?

 [MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Booleanamp; canBeCached, RuntimeMethodHandleamp; ctor, Booleanamp; bNeedSecurityCheck)  0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)  86
   System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)  230
   System.Activator.CreateInstance(Type type, Boolean nonPublic)  67
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)  80

[InvalidOperationException: An error occurred when trying to create a controller of type 'CommonProject.Web.Shared.Controllers.MyController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)  190
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)  68
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IControlleramp; controller, IControllerFactoryamp; factory)  118
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)  46
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext)  57
   System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext)  7
   System.Web.Mvc.MvcHttpHandler.VerifyAndProcessRequest(IHttpHandler httpHandler, HttpContextBase httpContext)  61
   System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContextBase httpContext)  111
   System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContext httpContext)  40
   System.Web.Routing.UrlRoutingHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context)  7
   CommonProject.Web._Default.Page_Load(Object sender, EventArgs e) in 
  

Ответ №1:

Я предполагаю, что в методе Application_Start() вашего HttpApplication (Global.asax.cs) вы устанавливаете фабрику контроллеров в качестве своей пользовательской фабрики контроллеров.

Я полагаю, что происходит то, что до выполнения этой строки кода где-то в Application_Start() генерируется исключение. Если это произойдет, любой последующий вызов веб-приложения обойдет это исключение, что может привести к неправильному поведению вашего приложения (например, к неиспользованию вашей фабрики пользовательских контроллеров).

Я бы отладил Application_Start() и убедился, что он выполняется правильно. Если вы используете ELMAH, то исключение должно быть зарегистрировано.