Почему мой контроллер Castle Windsor factory GetControllerInstance() вызывается с нулевым значением?

Я использую Castle Windsor для управления экземплярами контроллера (между прочим). Мой контроллер factory выглядит следующим образом:

public class WindsorControllerFactory : DefaultControllerFactory
    {
        private WindsorContainer _container;

        public WindsorControllerFactory()
        {
            _container = new WindsorContainer(new XmlInterpreter());

            var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                                  where typeof(Controller).IsAssignableFrom(t)
                                  select t;

            foreach (Type t in controllerTypes)
            {
                _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
            }
        }

        protected override IController GetControllerInstance(Type controllerType)
        {
            return (IController)_container.Resolve(controllerType); // ArgumentNullException is thrown here
        }

Когда я запускаю свое приложение ASP.Net MVC и пытаюсь перейти к "/" (или другому пути), я получаю ArgumentNullException. Я поставил точку прерывания при входе в GetControllerInstance и обнаружил, что он однажды вызвал мой HomeController, а затем второй раз с нулевым значением (который возникает, когда генерируется исключение). Почему он снова вызван?

Должен ли я изменить метод на что-то вроде этого:

protected override IController GetControllerInstance(Type controllerType)
{
    if (controllerType == null)
        return null;

    return (IController)_container.Resolve(controllerType);
}

Ответ 1

Получается, что вторым запросом была MVC-инфраструктура, пытающаяся найти script, включенный в Site.Master. Путь не существовал, поэтому я предполагаю, что он попытался разрешить контроллер (который соответствовал /Scripts/sitescripts.js). Я изменил метод на это:

protected override IController GetControllerInstance(Type controllerType)
{
    if (controllerType != null)
    {
       return (IController)_container.Resolve(controllerType);
    }
    else
    {
       return base.GetControllerInstance(controllerType);
    }
}

И было создано исключение с понятным сообщением.

Ответ 2

Если эта проблема возникла при выполнении Pro ASP.NET MVC Framework, добавлена ​​

routes.IgnoreRoute( "favicon.ico" );

для маршрутов в файле global.asax.cs, и он работает. Подробнее здесь: услуга favicon.

Ответ 3

относительно регистрации всех контроллеров, которые вы обычно делаете так:

container.Register(
   AllTypes.FromThisAssembly()
      .BasedOn<IController>()
      .Configure(c => c.Lifestyle.Transient)
);

Подробнее об API-интерфейсе см. документацию.