ASP.NET MVC在IIS7中不使用控制器来显式文件路由

时间:2010-03-29 22:23:01

标签: asp.net-mvc iis-7 controller asp.net-routing

考虑一个定位和提供文件的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返回一个IIS生成的404,大概是因为它实际上在web根文件夹中找不到它的favicon.ico。

我在StaticResourceController中发生了足够的事情,这对我的应用程序来说不是一件好事,特别是因为它是多租户而且favicon.ico文件可以改变。我已设置我的Web服务器模块来处理每个请求并覆盖RouteCollection以忽略使用RouteExistingFiles的文件检查。

为什么UrlRoutingModule会妨碍我在IIS7中使用并强制从磁盘(404)提供静态文件?

2 个答案:

答案 0 :(得分:1)

如果其他人遇到此问题,解决方案是您需要让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}");

答案 1 :(得分:1)

除了Daniel Crennan的回答,你需要在system.webServer部分添加web.confug文件:

<modules runAllManagedModulesForAllRequests="true"/>