Мы запускаем веб-приложение, распределенное по трем веб-серверам с балансировкой нагрузки. Точно такая же база кода и конфигурация развернуты на 3 серверах, и примерно 1 час назад я получаю следующую ошибку на одном из них, но не на двух других.

System.InvalidOperationException: An error occurred when trying to create a controller of type 'XXX.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor. ---> System.MissingMethodException: No parameterless constructor defined for this object.
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
   at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
   --- End of inner exception stack trace ---
   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.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)

Мы запускаем это с помощью ASP.NET MVC (с кэшированием вывода), NHibernate (с кэшированием NHibernate) и StructureMap. Кэш не является общим, поэтому каждый веб-сервер управляет своим собственным кешем, хотя зависимости кеша одинаковы для всех трех серверов.

Я действительно не знаю, с чего начать описывать, что / где может пойти не так, или обстоятельства, потому что это так странно для меня.

Я видел это однажды, около 2 недель назад, но оно исчезло само по себе примерно через час, и с тех пор я его не видел. Кто-нибудь еще видел такую ​​ошибку раньше?

2
DaveDev 30 Авг 2011 в 13:41

2 ответа

Лучший ответ

Что ж, похоже, в вашем HomeController отсутствует конструктор без параметров. Вы уверены, что он есть? Фабрика контроллеров по умолчанию нуждается в нем для инициализации вашего конструктора.

Если вы не используете свой собственный ControllerFactory, в этом случае вам необходимо зарегистрировать его во время Application_Start:

protected void Application_Start()
{
     //other code

     ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory());
}
1
Edwin de Koning 30 Авг 2011 в 09:54

Предполагая, что вы разрешаете контроллеры с помощью карты структуры, возможно, ваши компоненты зарегистрированы в неправильном месте / времени.

Вы регистрируете компоненты в Application_Start?

0
mathieu 30 Авг 2011 в 09:47