Фабрика контроллера StructureMap и экземпляр нулевого контроллера в MVC - PullRequest
10 голосов
/ 29 мая 2009

Я все еще пытаюсь разобраться в этом с помощью StructureMap, и одна из проблем, с которыми я сталкиваюсь, заключается в том, что мой класс Controller Factory разрывается при передаче ему нулевого типа контроллера. Это происходит только тогда, когда приложение собирается впервые, после чего каждая последующая сборка работает нормально. Даже когда я закрываю Visual Studio и снова открываю проект (я не запускаю это в IIS). Как будто происходит какое-то кэширование. Вот как выглядит класс контроллера:

public class IocControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(Type controllerType)
    {
        try
        {
            return (Controller)ObjectFactory.GetInstance(controllerType);
        }
        catch (StructureMapException)
        {
            System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
            throw;
        }
    }
}

Что может быть не так? Нужно ли мне регистрировать каждый контроллер? Спасибо.

Ответы [ 4 ]

8 голосов
/ 29 октября 2009

Большинство браузеров ищут файл favicon.ico, когда вы загружаете сайт, и, возможно, с этим поведением связано некоторое кэширование, это может объяснить странную вещь, которую вы упомянули, «только при первой сборке»

В моем случае это вызывало проблему с нулевым типом контроллера на фабрике контроллеров.

Добавление routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); в global.asax устраняет ошибку, запрос должен перейти к файловой системе без MVC, ищущего контроллер favico.ico в вашем коде.

Вот ссылка на сообщение Гуннара Пейпмана об этом

Я узнал об этом, переопределив GetControllerType (string controllerName) в моем классе фабрики пользовательских контроллеров и проверив, какое значение controllerName было для каждого запроса.

5 голосов
/ 20 июня 2009

Я столкнулся с той же проблемой с фабрикой контроллеров, построенной вокруг ninject.

Кажется, что MVC передаст вам значение null для контроллера, если он не может разрешить маршрут из таблицы маршрутизации или когда маршрут указывает несуществующий контроллер. Я сделал две вещи, чтобы решить это. Возможно, вы захотите проверить таблицу маршрутов и добавить универсальный маршрут, который показывает страницу ошибки 404, как описано здесь .Net MVC Routing Catchall не работает

Вы также можете проверить с помощью отладчика маршрутизации, что идет не так. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

1 голос
/ 17 июля 2009

У меня была похожая проблема. Я считаю, что это были HTTP-запросы на несуществующие изображения, CSS-файлы и т. Д.

Мы знаем, что маршрутизация MVC сначала проверяет, существует ли запрошенный файл физически. Если это не так, то URL проверяется на соответствие настроенным маршрутам. Я думаю, что запрос на изображение, которое физически не существовало, было передано механизму маршрутизации и не соответствовало никаким маршрутам, поэтому использовался NULL.

Таким образом, чтобы исправить это, используйте FireBug или что-то, чтобы отслеживать и исправлять неработающие HTTP-запросы. Во время разработки я использовал такой маршрут, чтобы временно обойти эти проблемы (все мои папки ресурсов начинаются с символа подчеркивания, например _Images, _Styles и т. Д.):

routes.IgnoreRoute("_*");  // TODO: Remove before launch

Надеюсь, это поможет!

0 голосов
/ 24 октября 2012

Я думаю, вам нужно сделать то же самое, что и фабрика контроллеров MVC по умолчанию для метода GetControllerInstance. Если вы посмотрите на исходный код Microsoft для DefaultControllerFactory на http://aspnetwebstack.codeplex.com/, то увидите, что DefaultControllerFactory выдает исключение 404, когда controllerType имеет значение null. Вот как мы это делаем, основываясь на этой информации:

 public class StructureMapControllerFactory : DefaultControllerFactory
 {
      protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
      {
           if (controllerType == null)
                return base.GetControllerInstance(requestContext, controllerType);
           var controller = ObjectFactory.GetInstance(controllerType);
           return (IController)controller;
      }
 }

По сути, это гарантирует, что когда пользователь вводит неверный маршрут, приложение обрабатывает его как ошибку 404.

...