2

我可以(不使用 runAllManagedModulesForAllRequests = true)将带有 *.html 的 URL 路由到默认控制器/操作模式吗?

我需要所有对 www.myhost.com/any/any/abcd.html 的请求都使用“link”RouteData key =“any/any/abcd.html”路由到 www.myhost.com/home/oldlink

我尝试了使用 {*link} 和约束链接 =“.html$”的 MapRoute,但所有请求都带有点 - 捕获 StaticFileHandler ...

4

1 回答 1

3

您可以使用这样的路线:

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 方法,并且“link”字符串变量将具有值

"foo/bar/file.html"

这条路线有几点需要注意:

  1. 此路由的 URL 模式将匹配所有传入的 URL。因此,应用程序中的任何 URL 都将路由到“home”控制器上的“oldlink”操作。使用此路由,您将无法获取任何 URL 以转到任何其他路由。

  2. 默认情况下,ASP.Net 路由引擎将首先检查磁盘上是否存在与 URL 匹配的物理文件。这样,你就不用担心路由系统对静态文件的路由请求了,比如css或者javascript文件。这意味着如果将 URL 发送到与磁盘上的文件匹配的应用程序,它将不会被路由到“home”控制器上的“oldlink”操作。如果要更改此默认行为并让路由引擎路由所有内容,包括对静态文件的请求,则需要将以下行添加到 global.asax 文件的“RegisterRoutes”方法中:

    路线.RouteExistingFiles = true;

有关 URL 段中包罗万象的路由段的更多信息,请参阅这篇关于路由的优秀 MSDN 文章中标题为“在 URL 模式中处理可变数量的段”的部分。有关 RouteExistingFiles 属性的更多信息,请参见此处

于 2013-02-16T20:06:58.800 回答