我在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,所以我已经更新了标签。
答案 0 :(得分:2)
我检查了这个,就像我想的那样。 URL重写和路由不是设计为在同一请求上一起使用。将Routing视为URL重写的一种特殊形式,因此两者相互干扰。
我知道这感觉就像是一个错误,因为它没有像你期望的那样工作,但这完全符合它的预期。考虑管道以及模块何时进入,以及路由模块已经完成的工作。事情必须按顺序发生,因此解码发生,网址重写发生等等。