MVC3自定义URL重写器HttpModule RouteData损坏

时间:2013-06-10 20:41:55

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

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

示例网址:

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

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

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

这会将http://www.mysite.com/my%20url?test等网址重写为http://www.mysite.com/my%20url&lt; - 请注意,查询字符串会消失。这功能正常。

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

"{*navstate}"

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

key: "navstate" value: "my url"

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

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

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

有没有人对此有任何想法?唯一可能产生影响的是在我的HttpModule中使用HttpContext.RewritePath(string) ...关闭模块可确保正常运行。使用HttpUtility.UrlDecode(string)在重写调用之前手动解码URL也可以使其工作......但感觉就像是黑客。

修改

这似乎是一个不是MVC的错误,但是使用ASP.NET Routing,所以我已经更新了标签。

1 个答案:

答案 0 :(得分:2)

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

我知道这感觉就像是一个错误,因为它没有像你期望的那样工作,但这完全符合它的预期。考虑管道以及模块何时进入,以及路由模块已经完成的工作。事情必须按顺序发生,因此解码发生,网址重写发生等等。