我试图了解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的操作中结束。您不会喜欢的东西。