自定义URL重写器HttpModule RouteData损坏

本文关键字:RouteData 损坏 HttpModule URL 重写 自定义 | 更新日期: 2023-09-27 18:17:51

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

示例URL:

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

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

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

这会将URL(如http://www.mysite.com/my%20url?test)重写为http://www.mysite.com/my%20url <——注意,querystring消失了。

我的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。

自定义URL重写器HttpModule RouteData损坏

我检查了一下,正如我所想的那样。URL重写和路由没有被设计成在同一个请求上一起使用。将路由看作是URL重写的一种特殊形式,因此两者会相互干扰。

我知道这感觉像是一个bug,因为它没有像你期望的那样工作,但是它的工作完全像它应该的那样。考虑一下管道,以及你的模块何时进入管道,以及路由模块已经完成的工作。事情必须按顺序进行,解码,url重写等等