Путь контроллера не найден для статических изображений? Проблема с маршрутизацией asp.net mvc?

У меня есть папка с изображениями, хранящаяся в ~/Content/Images/

Я загружаю эти изображения через

<img src="/Content/Images/Image.png" />

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

Кто-нибудь знает, что не так с моими маршрутами? Я пропустил маршрут игнорирования для /Content/folder?

Я также получаю ту же ошибку для favicon.ico и кучу других файлов изображений...

<Fatal> -- 3/25/2010 2:32:38 AM -- System.Web.HttpException: The controller for path '/Content/Images/box_bottom.png' could not be found or it does not implement IController.
at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)
at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext)
at System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Мои текущие маршруты выглядят следующим образом:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "ControllerDefault",                                              // Route name
            "{controller}/project/{projectid}/{action}/{searchid}",                           // URL with parameters
            new { controller = "Listen", action = "Index", searchid = "" }  // Parameter defaults
        );

Спасибо!

Ответы

Ответ 1

Я бы ввел еще один игнорированный маршрут сразу под первым.

routes.IgnoreRoute("Content/Images/{*pathInfo}");

Ответ 2

Если вы посмотрите на просмотр проводника решения, я предполагаю, что папка "Содержимое" находится в корне проекта вместе с папкой "Контроллеры и представления". Попробуйте изменить изображение src, как показано ниже...

<img src="../../Content/Images/Image.png" />

Ответ 3

<img src="<%= Url.Content("~/Content/Images/Image.png")%>" alt="does this work?" />

Ответ 4

Вам нужно объявить менее конкретные маршруты в нижней части:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    "ControllerDefault",
    "{controller}/project/{projectid}/{action}/{searchid}",
    new { controller = "Listen", action = "Index", searchid = "" }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = "" }
);

Но я не думаю, что это проблема здесь. Из исключения кажется, что веб-сервер, выполняющий это приложение, имеет подстановочное сопоставление с фильтром aspnet_isapi, означающее, что весь файл будет связан с временем выполнения ASP.NET даже с статическими файлами.

Ответ 5

У вас нет routes.RouteExistingFiles = true; где-нибудь?

Ответ 6

Исключение ... could not be found or it does not implement IController не должно быть ошибкой. На самом деле /favicon.ico не разрешает контроллер, поэтому это означает, что следующий модуль (или обработчик?) Должен попытаться обработать запрос. Таким образом, это "ожидаемое исключение".

Проблема заключается в том, что это исключение регистрируется и забивает журналы. При использовании log4net добавление следующего элемента <filter> к приложению по умолчанию должно быть неактивным:

<filter type="log4net.Filter.StringMatchFilter">
  <regexToMatch value="System.Web.HttpException \(0x80004005\): The controller for path '[^']*' was not found or does not implement IController\." />
  <acceptOnMatch value="false" />
</filter>