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 时,它应该给我一个错误,因为没有“内容”控制器,并且请求肯定会达到默认模式。但相反,我看到的是我的 HTMLPage。我在这里做错了什么?

更新:我想我将不得不放弃。即使我要添加这样的路线:

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

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

4

3 回答 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 添加以下条目。

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

根据您的要求,“路径”的值可以更通用或更具体。但我更喜欢它总是根据自己的需要非常具体。保持非常通用将阻止其他站点特定资源的服务,例如 .js 或 css 文件。例如,如果上面设置为 path="*",那么即使是负责页面外观的 css(在内容文件夹内)也将在控制器的操作中结束。你不会喜欢的东西。

于 2014-02-12T10:12:20.280 回答
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

于 2013-06-15T12:04:41.760 回答
5

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

于 2012-12-16T22:03:40.573 回答