【问题标题】:ASP.NET MVC 3: RouteExistingFiles = true seems to have no effectASP.NET MVC 3: RouteExistingFiles = true 似乎没有效果
【发布时间】:2012-12-16 21:58:13
【问题描述】:

我正在尝试了解 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 中检查这一点,请告诉我你得到了什么结果。 谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    在 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(在内容文件夹内)也将在控制器的操作中结束。你不喜欢的东西。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 具有“{controller}/{action}/{id}”模式的默认路由看起来是 ~/Content/HTMLPage.html 请求的一个很好的候选者。所以有一条匹配的路线。
      • @OleksandrKaplun:仅当您实际上有一个名为“Content”的控制器和该控制器中名为“HTMLPage.html”的操作方法时才匹配。
      • 听起来很有说服力,但还是不行。这是我添加到我的 RegisterRoutes 函数顶部的内容:routes.MapRoute( "ExactMatch", "Content/HTMLPage.html", new {controller = "Home", action = "About"});。仍然向我显示 html 页面的内容。附:我知道它应该像这样工作(手册上说应该),但事实并非如此,所以我猜这是我做错了。我在 VS2012 和 Windows 7 上进行本地测试。
      • 它在 VS2010 和 Empty MVC 3 项目上按预期工作。会继续挖掘。
      • @OleksandrKaplun 有什么发现吗?
      猜你喜欢
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2018-05-18
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多