ASP.NET MVC não usa controlador para rota de arquivo explícita no IIS7
-
23-09-2019 - |
Pergunta
Considere um StaticResourceController que localiza e fornece arquivos.
Configurei uma rota explícita para "favicon.ico" que tratará a solicitação deste arquivo usando StaticResourceController:
routes.MapRoute(
"favicon",
"favicon.ico",
new { controller = "StaticResource", action = "Get", file = "favicon.ico", area="root"},
new[] { "Dimebrain.Mvc.Controllers" }
);
No IIS6 o resultado esperado ocorre ao fazer uma solicitação de http://localhost:8080/favicon.ico.
Infelizmente, quando eu implanto no IIS7 http://localhost/favicon.ico retorna um 404 gerado pelo IIS, provavelmente porque na verdade está procurando o favicon.ico na pasta raiz da web, onde ele não existe.
Já tenho coisas suficientes acontecendo no StaticResourceController que isso não é bom para meu aplicativo, especialmente porque ele é multilocatário e o arquivo favicon.ico pode mudar.Eu configurei meus módulos de servidor web para lidar com todas as solicitações e substituir o RouteCollection para desconsiderar as verificações de arquivos com RouteExistingFiles.
Por que o UrlRoutingModule está atrapalhando no IIS7 e forçando o envio do arquivo estático do disco (404)?
Solução
Caso qualquer outra pessoa entre nesse problema, a solução é que você precisa que você informe o MVC para não processar solicitações em pastas onde seus arquivos estáticos reais vivem:
// 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}");
Outras dicas
Além da resposta de Daniel Crenna, você precisa adicionar o arquivo web.confug na seção system.webServer:
<modules runAllManagedModulesForAllRequests="true"/>