2013-06-12 2 views
0

У меня есть приложение MVC 3 с this той же проблемой. Я использую Ninject для инъекции зависимостей. Я не могу проследить, какой контроллер имеет проблему, вчера он сломался, и я провел целый день, пытаясь найти. В приложении более 60 контроллеров. Исключение не может быть обнаружено или отлажено, и трассировка не дает сколько-нибудь значимой информации о проблемном контроллере источника. Никакое действие для любого контроллера не может быть доступно без исключения этого исключения.MVC 3 Исключение: убедитесь, что у контроллера есть беззаторный публичный конструктор

Кто-нибудь знает, как я могу определить фактического контроллера, имеющего проблему?

Благодаря

Внутренняя Исключение:

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) 
+1

'Никакие действия для любого контроллера не могут быть доступны без исключения этого исключения. '. Это похоже на то, что вы вводите в контроллер _every_, или фильтр действий, который используется во всех контроллерах, нарушен (т.е. отсутствует зависимость). Один сломанный контроллер не должен разрушать всю систему. –

+0

Хм, это может быть ничего, так как я не уверен, что будет выглядеть трассировка стека, если на самом деле он использует NInject для разрешения контроллера, но для меня это похоже на использование активатора по умолчанию вместо NInject. Вы уверены, что NInject правильно зарегистрирован? –

+0

Да, определенно не используется Ninject. См. Строку во внутреннем исключении, которое говорит 'System.Activator.CreateInstance' –

ответ

0

Кажется Ninject либо не зарегистрирован правильно, чтобы решить что-либо вообще, либо он не может разрешить любой из контроллера типы. Из источника MVC3 это вызов Activator.CreateInstance, который отображается в трассировке стека;

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

Другими словами, он не будет вызывать Activator.CreateInstance вообще, если контроллер не может быть решен правильно Ninject.

Другими словами, вы, вероятно, должны прекратить поиск проблемы в своих контроллерах и начать проверку регистрации NInject. Простейшим первым шагом было бы сделать мертвый глупый контроллер с конструктором по умолчанию, установить точку останова в конструкторе и увидеть, что трассировка стека отражает то, что конструктор вызывается NInject. Если это не так, NInject зарегистрирован неправильно.

+0

Спасибо за ответ. Никакая точка останова в конструкторе никогда не попадает. –

+0

@GordonHickley Даже при использовании безпараметрического конструктора на вашем тестовом контроллере? По-прежнему получать одну и ту же трассировку стека? –

0

контрейлерных от Иоакима выше:

Определение NInjectControllerFactory не достаточно, вы также должны убедиться, чтобы зарегистрировать контроллер в Global.asax.cs

я получаю те же проблемы - т.е. Класс Ninject был определен в Project> Infrastructure> NinjectControllerFactory.cs, но при компиляции и навигации по упрощенным маршрутам не ударяли точки останова. Следующая строка должна быть добавлена ​​в Application_Start():

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

Убедитесь, что введенный класс является абстрактным. Этот тип класса не может быть создан.

Смежные вопросы