我正在尝试了解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
);
}
现在,当我请求本地主机时,它应该给我一个错误:XXXX / Content / HTMLPage.html,因为没有“内容”控制器,请求肯定会达到默认模式。但相反,我正在看我的HTMLPage。 我在这里做错了什么?
更新: 我想我不得不放弃。 即使我正在添加像这样的路线:
routes.MapRoute("", "Content/{*anything}", new {controller = "Home", action = "Index"});
它仍然显示HTMLPage的内容。 当我请求像〜/ Content / HTMLPage这样的URL时,我按预期获得了索引页面,但是当我添加像.html或.txt这样的文件扩展时,会显示内容(如果文件不存在,则会出现404错误) 。 如果有人可以在VS2012中查看,请告诉我你得到的结果。 谢谢。
答案 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
不会阻止查看文件,它只会在检查文件是否存在之前检查路由。如果没有匹配的路由,它将继续检查是否存在匹配的文件。