我试图了解RouteExistingFiles的工作方式。
因此,我创建了一个新的MVC 3 Internet项目(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”控制器,并且该请求肯定符合默认模式。但是相反,我看到的是HTMLPage。
我在这里做错了什么?

更新:
我想我必须放弃。
即使我要添加这样的路线:

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


它仍然显示了HTMLPage的内容。
当我请求〜/ Content / HTMLPage之类的URL时,按预期方式获得了索引页面,但是当我添加.html或.txt之类的文件扩展名时,将显示内容(如果文件不存在,则显示404错误)。 。
如果有人可以在VS2012中进行检查,请告诉我您得到了什么结果。
谢谢。

最佳答案

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

在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" />


“ path”的值可以更通用或更具体,具体取决于您的要求。但是我更喜欢根据需要始终非常具体。保持通用性会阻止其他站点特定资源(例如.js或CSS文件)的投放。例如,如果将上面的设置为path =“ *”,则甚至要求负责页面外观的css(在内容文件夹中)也将在Controller的操作中结束。您不会喜欢的东西。

07-24 15:37