ASP.NET MVC 3:RouteExistingFiles = true似乎没有任何效果

时间:2012-12-16 21:58:14

标签: asp.net-mvc asp.net-mvc-routing

我正在尝试了解RouteExistingFiles的工作原理。 所以我创建了一个新的MVC 3互联网项目(MVC 4的行为方式相同),并将HTMLPage.html文件放到我项目的Content文件夹中。 现在我去了Global.Asax文件并编辑了Re​​gisterRoutes函数,看起来像这样:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.RouteExistingFiles = true; //Look for routes before looking if a static file exists

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

现在,当我请求本地主机时,它应该给我一个错误:XXXX / Content / HTMLPage.html,因为没有“内容”控制器,请求肯定会达到默认模式。但相反,我正在看我的HTMLPage。 我在这里做错了什么?

更新: 我想我不得不放弃。 即使我正在添加像这样的路线:

routes.MapRoute("", "Content/{*anything}", new {controller = "Home", action = "Index"});

它仍然显示HTMLPage的内容。 当我请求像〜/ Content / HTMLPage这样的URL时,我按预期获得了索引页面,但是当我添加像.html或.txt这样的文件扩展时,会显示内容(如果文件不存在,则会出现404错误) 。 如果有人可以在VS2012中查看,请告诉我你得到的结果。 谢谢。

3 个答案:

答案 0 :(得分:18)

要启用静态文件的路由,您必须执行以下步骤。

在RouteConfig.cs中启用现有文件的路由

routes.RouteExistingFiles = true;

为路径添加路径(确保专用路径位于通用路径上方)

routes.MapRoute(
            name: "staticFileRoute",
            url: "Public/{file}/",
            defaults: new { controller = "Home", action = "SomeAction" }
        );

接下来配置您的应用程序,以便“TransferRequestHandler”对所有静态文件的请求进行处理。在system.webServer>处理程序下的Webconfig中添加以下条目。

<add name="MyCustomUrlHandler2" path="Public/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

“路径”的值可以更通用或具体,具体取决于您的要求。但我更喜欢根据需要总是非常具体。保持非常通用将阻止提供其他站点特定资源,如.js或css文件。例如,如果将上面设置为path =“*”,那么请求甚至负责页面外观的css(在内容文件夹中)也将最终出现在Controller的操作中。你不喜欢的东西。

答案 1 :(得分:6)

Visual Studio 2012使用IIS Express。您需要告诉IIS在将磁盘文件传递给MVC路由系统之前不要拦截磁盘文件的请求。您需要将preCondition属性设置为配置文件中的空字符串:

<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" 
     preCondition="" />

在Win7 / 8中,您可以在此路径中找到配置文件:%userprofile%\Documents\IISExpress\config\applicationhost.config

答案 2 :(得分:5)

如果没有路由,RouteExistingFiles不会阻止查看文件,它只会在检查文件是否存在之前检查路由。如果没有匹配的路由,它将继续检查是否存在匹配的文件。