【问题标题】:MVC3 Custom URL Rewriter HttpModule RouteData corruptionMVC3 自定义 URL 重写器 HttpModule RouteData 损坏
【发布时间】:2013-06-06 14:45:44
【问题描述】:

我在 ASP.NET MVC3 中有一些非常奇怪的行为。基本上,我编写了一个在 BeginRequest 上触发的 HttpModule,它可能使用HttpContext.RewritePath(string) 重写我的 URL。这在大多数情况下都能正常工作,但我注意到当我的 URL 中有空格时,ASP.NET MVC 在重写时的行为会有所不同。

示例网址:

http://www.mysite.com/my%20url

我的重写器设置了正则表达式,类似于 Helicon,它可以捕获一个组并在重写中使用该捕获的组。一个示例规则是:

<add original="^/(.*)\?test$" rewritten="/$1" />

这会将@987654321@ 等URL 重写为@987654322@

我的 MVC 路由设置为使用通配符捕获 my%20url 部分,以便将其映射到“navstate”键下的 RouteData 值。规则如下:

"{*navstate}"

所以,当我不重写时,我的 RouteDataDictionary 包含:

key: "navstate" value: "my url"

当我重写时,我的 RouteDataDictionary 包含:

key: "navstate" value: "my%20url"

请注意,它没有对 RouteData 变量进行 URL 解码。

有人对此有任何想法吗?唯一似乎有所不同的是在我的 HttpModule 中使用 HttpContext.RewritePath(string)... 关闭模块可确保功能正常。在 rewrite 调用之前使用 HttpUtility.UrlDecode(string) 手动解码 URL 也可以使它工作......但感觉就像一个 hack。

编辑:

这似乎不是 MVC 的错误,而是 ASP.NET 路由的错误,所以我已经更新了标签。

【问题讨论】:

    标签: c# asp.net url-rewriting url-routing asp.net-routing


    【解决方案1】:

    我检查了这个,这和我想的一样。 URL 重写和路由并非设计为在同一个请求上一起使用。将路由视为 URL 重写的一种特殊形式,因此两者相互干扰。

    我知道这感觉像是一个错误,因为它没有按您预期的那样工作,但这完全按照它应该的方式工作。考虑一下管道以及您的模块何时进入那里与路由模块已经完成的工作。事情必须按顺序发生,所以会发生解码,发生 url 重写等。

    【讨论】:

    • 很公平。如果解码发生在我的 BeginRequest 事件之前,我需要重新解码我重写的 URL,这是有道理的。谢谢斯科特-我非常感谢研究和跟进。在路由程序集的未来构建中强制对 RouteDataDictionary 分配进行解码是否值得?
    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 2018-08-14
    • 2012-10-04
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2011-03-19
    相关资源
    最近更新 更多