【问题标题】:How can I set up routing in ASP.Net MVC to have requests for html files bypass the StaticFileHandler and be handled by the routing engine?如何在 ASP.Net MVC 中设置路由以使对 html 文件的请求绕过 StaticFileHandler 并由路由引擎处理?
【发布时间】:2013-02-11 20:00:31
【问题描述】:
我可以(不使用 runAllManagedModulesForAllRequests = true)将带有 *.html 的 URL 路由到默认控制器/操作模式吗?
我需要所有对 www.myhost.com/any/any/abcd.html 的请求都使用 "link" RouteData key = "any/any/abcd.html" 路由到 www.myhost.com/home/oldlink
我尝试了使用 {*link} 和约束 link = ".html$" 的 MapRoute,但所有请求都带有点 - 捕获 StaticFileHandler...
【问题讨论】:
标签:
asp.net-mvc
asp.net-mvc-routing
url-routing
asp.net-routing
【解决方案1】:
你可以使用这样的路由:
routes.MapRoute("", "{*link}",
new { action = "oldlink", controller = "home" });
这会将所有请求定向到以下控制器和操作方法:
public class HomeController : Controller
{
public ActionResult OldLink(string link)
{
//implement method...
return View((object)link);
}
}
星号表示该段是所谓的“catchall”段。这允许您将任意长度的 URL 匹配到单个路由。在此路由中,主机名之后的 URL 中的所有段都分配给“链接”字符串变量。
例如,如果您输入 URL:
http://localhost/foo/bar/file.html
它将路由到 OldLink 方法,并且“链接”字符串变量将具有值
"foo/bar/file.html"
关于这条路线的几点注意事项:
此路由的 URL 模式将匹配 ALL 个传入 URL。因此,应用程序中的任何 URL 都将路由到“home”控制器上的“oldlink”操作。使用此路由,您将无法获取任何 URL 以转到任何其他路由。
-
默认情况下,ASP.Net 路由引擎将首先检查磁盘上是否存在与 URL 匹配的物理文件。这样,你就不用担心路由系统对静态文件的路由请求了,比如css或者javascript文件。这意味着如果将 URL 发送到与磁盘上的文件匹配的应用程序,它将不会被路由到“home”控制器上的“oldlink”操作。如果您想更改此默认行为并让路由引擎路由一切,包括对静态文件的请求,您需要将以下行添加到 global.asax 文件的“RegisterRoutes”方法中:
routes.RouteExistingFiles = true;
有关 URL 段中包罗万象的路由段的更多信息,请参阅这篇出色的 MSDN article on routing 中标题为“在 URL 模式中处理可变数量的段”的部分。有关 RouteExistingFiles 属性的更多信息,see here。