ASP.NET MVC не использует контроллер для явного маршрута файла в IIS7

StackOverflow https://stackoverflow.com/questions/2541650

Вопрос

Рассмотрим StaticResourceController, который находит и обслуживает файлы.

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

routes.MapRoute(
        "favicon",
        "favicon.ico",
        new { controller = "StaticResource", action = "Get", file = "favicon.ico", area="root"},
        new[] { "Dimebrain.Mvc.Controllers" }
        );

В IIS6 ожидаемый результат возникает при выполнении запроса на http://localhost:8080/favicon.ico.

К сожалению, когда я развертываю IIS7 http://localhost/favicon.ico возвращает ошибку 404, сгенерированную IIS, предположительно потому, что на самом деле он ищет файл favicon.ico в корневой папке веб-сайта, где он не существует.

У меня достаточно событий в StaticResourceController, и это нехорошо для моего приложения, тем более что оно мультитенантное и файл favicon.ico может измениться.Я настроил модули своего веб-сервера на обработку каждого запроса и переопределил RouteCollection, чтобы игнорировать проверки файлов с помощью RouteExistingFiles.

Почему UrlRoutingModule мешает мне в IIS7 и заставляет обслуживать статический файл с диска (404)?

Это было полезно?

Решение

Если кто-то еще столкнется с этой проблемой, решение заключается в том, что вам нужно сообщить MVC, что не следует обрабатывать запросы в папках, где находятся ваши фактические статические файлы:

// Make sure MVC is handling every request for static files
routes.RouteExistingFiles = true;

// Don't process routes where actual static resources live
routes.IgnoreRoute("content/{*pathInfo}");
routes.IgnoreRoute("scripts/{*pathInfo}");
routes.IgnoreRoute("areas/admin/content/{*pathInfo}");
routes.IgnoreRoute("areas/admin/scripts/{*pathInfo}");

Другие советы

В дополнение к ответу Дэниела Кренны вам необходимо добавить файл web.confug в раздел system.webServer:

<modules runAllManagedModulesForAllRequests="true"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top