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

12

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

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
            );
    }
现在当我请求localhost:XXXX/Content/HTMLPage.html时,它应该给我一个错误,因为没有"Content"控制器,而请求肯定会命中默认模式。但是我看到的是我的HTML页面。我在这里做错了什么?
更新: 我想我必须放弃了。 即使我添加一个像这样的路由:
routes.MapRoute("", "Content/{*anything}", new {controller = "Home", action = "Index"});

即使我请求的URL是~/Content/HTMLPage,它仍然显示HTML页面的内容。 但是当我添加文件扩展名,例如.html或.txt时,会显示内容(如果文件不存在,则会显示404错误)。 如果有人可以在VS2012中检查这个问题,请让我知道你得到的结果。 谢谢。

3个回答

19

要使静态文件能够进行路由,您需要执行以下步骤。

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

routes.RouteExistingFiles = true;
为您的路径添加路由(确保专用路径位于常规路径之上)。
routes.MapRoute(
            name: "staticFileRoute",
            url: "Public/{file}/",
            defaults: new { controller = "Home", action = "SomeAction" }
        );

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

下一步是配置您的应用程序,以便由“TransferRequestHandler”处理静态文件请求。在Webconfig的system.webServer>handlers中添加以下条目。

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

'path'的值可以根据您的需求更加通用或特定。但是我建议根据需要始终保持非常具体。保持非常通用将阻止提供其他网站特定资源,例如 .js 或 css 文件。例如,如果将其设置为 path="*",则甚至会请求在内容文件夹中负责页面外观的 css 文件也会送到您的控制器操作中。这是您不喜欢的。


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

这对我有用,谢谢,但我认为它不能针对每个解决方案进行配置? - Savage
你可以在添加这个模块之前加上 <remove name="UrlRoutingModule-4.0"/>。参考 https://svenaelterman.wordpress.com/2011/01/31/using-asp-net-4-0-extension-less-routing-on-iis-7-5/。 - XPD

5

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


具有“{controller}/{action}/{id}”模式的默认路由看起来是~/Content/HTMLPage.html请求的一个很好的候选项。因此,存在匹配的路由。 - Oleksandr Kaplun
@OleksandrKaplun:只有在您实际拥有名为“Content”的控制器和该控制器中名为“HTMLPage.html”的操作方法时,才会匹配。 - Guffa
听起来很有说服力,但仍然不起作用。这是我在RegisterRoutes函数顶部添加的内容:routes.MapRoute( “ExactMatch”, “Content / HTMLPage.html”, new {controller =“Home”,action =“About”});。仍然显示HTML页面的内容。 P.S.我知道它应该像这样工作(手册上说应该),但它就是不起作用,所以我猜想是我做错了什么。我正在VS2012和Windows 7上进行本地测试。 - Oleksandr Kaplun
在VS2010和空的MVC 3项目上按预期工作。会继续深入挖掘。 - Oleksandr Kaplun
@OleksandrKaplun 有任何发现吗? - Volodymyr Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接