Я наконец-то понял эту проблему недавно. По-видимому, функция NinjectHttpApplication.RegisterAllControllersIn () не выполняет всех необходимых необходимых привязок. Он связывает ваши конкретные реализации контроллера с запросами IController. Например, если у вас есть класс контроллера с именем SampleMvcController, который наследуется от System.Web.Mvc.Controller. При запуске приложения будет выполнено следующее именованное связывание:
kernel.Bind<IController>().To(SampleMvcController).InTransientScope().Named("SampleMvc");
Но при отладке NinjectControllerFactory я обнаружил, что делается запрос для ядра Ninject, чтобы он возвращал объект для класса "SampleMvcController", а не для конкретной реализации IController, используя именованную привязку "SampleMvc".
Из-за этого, когда выполняется первый веб-запрос, включающий SampleMvcController, он создает привязку SampleMvcController к себе. Это не потокобезопасный, хотя. Поэтому, если у вас есть несколько веб-запросов одновременно, привязки могут выполняться несколько раз, и теперь вы остаетесь с этой ошибкой, поскольку у вас есть несколько привязок для SampleMvcController.
В этом можно убедиться, быстро обновив URL-адрес MVC сразу после перезапуска веб-приложения.
Исправление:
Самый простой способ решить эту проблему - создать новый NinjectModule для привязок вашего контроллера и загрузить этот модуль во время запуска приложения. В этом модуле вы самостоятельно связываете каждый из определенных вами контроллеров, например:
class ControllerModule : StandardModule {
public override Load() {
Bind<SampleMvcController>().ToSelf();
Bind<AnotherMvcController>().ToSelf();
}
}
Но если вы не возражаете против изменения исходного кода Ninject, вы можете изменить функцию RegisterAllControllersIn (), чтобы самостоятельно связывать каждый контроллер, с которым он сталкивается.