ASP.NET MVC не использует контроллер для явного маршрута файла в IIS7
-
23-09-2019 - |
Вопрос
Рассмотрим 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"/>