Странная ошибка на одном веб-сервере в нашей производственной среде: исключение MissingMethod, хотя я не думаю, что метод отсутствует - PullRequest
2 голосов
/ 30 августа 2011

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

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. Кеш не является общим, поэтому каждый веб-сервер управляет своим собственным кешем, хотя зависимости кеша одинаковы для всех 3 серверов.

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

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

Ответы [ 2 ]

1 голос
/ 30 августа 2011

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

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

protected void Application_Start()
{
     //other code

     ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory());
}
0 голосов
/ 30 августа 2011

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

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

...