asp.net-mvc - 如何在 ASP.Net MVC 中设置路由以使 html 文件请求绕过 StaticFileHandler 并由路由引擎处理?

标签 asp.net-mvc asp.net-mvc-routing url-routing asp.net-routing

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

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

我尝试了使用 {*link} 和约束 link = ".html$"的 MapRoute,但所有请求都带有点 - catch StaticFileHandler...

最佳答案

您可以使用这样的路线:

routes.MapRoute("", "{*link}",  
                new { action = "oldlink", controller = "home" });

这会将所有请求定向到以下 Controller 和操作方法:

public class HomeController : Controller
{
    public ActionResult OldLink(string link)
    {
        //implement method...
        return View((object)link);
    }
}

星号表示该段是所谓的“包罗万象”的段。这允许您将任意长度的 URL 与单个路由相匹配。在此路由中,主机名后面的 URL 中的所有段都分配给“link”字符串变量。

例如,如果您输入 URL:

http://localhost/foo/bar/file.html

它将路由到 OldLink 方法,并且“link”字符串变量将具有该值

"foo/bar/file.html"

关于这条路线需要注意的几点:

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

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

    routes.RouteExistingFiles = true;

有关 URL 段中的包罗万象的路由段的更多信息,请参阅这篇优秀的 MSDN article on routing 中标题为“处理 URL 模式中可变数量的段”的部分。 。有关 RouteExistingFiles 属性的详细信息,see here .

关于asp.net-mvc - 如何在 ASP.Net MVC 中设置路由以使 html 文件请求绕过 StaticFileHandler 并由路由引擎处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14819837/

相关文章:

c# - 使用正则表达式在 Controller 中进行验证

c# - ASP.NET Identity 在每次请求时重新生成 Identity

c# - 显示字符串列表

c# - MVC 3 尝试启动 URL 以查看而不是 Controller 操作

asp.net-mvc - MVC 2.0 路由问题 - 无法识别 Url 参数

php - URL Router 和 Dispatcher 有什么区别?

c# - 使用 TempFileCollection 删除 ASP.NET MVC C# 中的临时文件

c# - 向 HttpDelete 操作发送 DELETE 请求时路由不起作用

ios - 试图追踪需要在 iOS 中实现 JSON 字典值的位置

php - 创建 "custom"用户 URL 时出现问题