为啥尾随 %20 (在这种情况下为有效数据)会杀死 asp.net mvc 路由
Posted
技术标签:
【中文标题】为啥尾随 %20 (在这种情况下为有效数据)会杀死 asp.net mvc 路由【英文标题】:Why does a trailing %20 (valid data in this case) kill asp.net mvc routing为什么尾随 %20 (在这种情况下为有效数据)会杀死 asp.net mvc 路由 【发布时间】:2011-03-13 11:24:57 【问题描述】:执行以下控制器操作
public ActionResult NextBySURNAME(int id, string data)
//code to process the data and edit the id accoringly not written yet
return RedirectToAction("Edit", new id = id );
如果我用 /Mycontroller/NextBySURNAME/12/Smith%20Simon
然后它工作正常(在这种情况下编辑记录 12) 但是
/Mycontroller/NextBySURNAME/12/Smith%20
给我一个 404
现在我知道在某些情况下,在我的问题域中,尾随空格很重要,所以我不只是想修剪它。那么为什么这会破坏我的路线呢?
routes.MapRoute(
"Default", // Route name
"controller/action/id/data", // URL with parameters
new controller = "Home", action = "Index", id = UrlParameter.Optional, data=UrlParameter.Optional // Parameter defaults
);
【问题讨论】:
Robert:我知道 code 恰好是 c#,但尾随 %20 破坏路由的问题(可能)不是特定于该语言的。我不想标记这个 c# 哇,刚试了下,有意思…… @Andiih & Robert:.net
可能是比c#
更具描述性的标签,但是我发现这个问题是因为我在寻找c#
也许尝试在您的网址中添加一个最终 / ?只是一种解决方法,听到这个我也很惊讶。
添加尾部斜杠并没有改变 URL 的处理方式。
【参考方案1】:
所以我做了一些路由调试,发现以空格结尾的路由甚至没有被我的 MVC 应用程序评估。因此,IIS 一定不能很好地处理这些请求。
我在 IIS 7.5 中添加了一个重写规则,以匹配尾随空格并将它们重写为相同的 url,没有空格。我对此解决方案不满意,但无法找到有关 IIS 为何错误处理带有尾随空格的 URL 的解释。
【讨论】:
听起来好像有人需要在 IIS 中的某处添加一个Trim()
。 :)
@JYelton & BC,如果你想搜索如下形式怎么办:"Hello "
如果发生修剪,这会中断。路由应该按预期工作并产生一个字符串(在 OP 的情况下)"Smith "
供他稍后处理。
我同意。如何让 IIS 发挥出色?
我做了一些测试,得出了同样的结论。以 %20 结尾的路由甚至不进入 MvcHandler : IHttpHandler。这是一个 IIS 问题。
遗憾的是,我确实需要区分空格和没有空格,因此重写规则对我没有帮助。我可能会对 %20 以外的东西进行自定义编码来解决它,但不高兴。谢谢 BC。我要暂时保持开放状态,以防其他人想出一些东西-但我有点怀疑:-)【参考方案2】:
我认为在 .NET 4.0 中处理转义字符的方式是可以改变的,但我自己没有尝试过。 见http://msdn.microsoft.com/en-us/library/system.uri.aspx。
安德鲁斯回复URL-encoded slash in URL
还有How to create a Uri instance parsed with GenericUriParserOptions.DontCompressPath
这只是疯狂的猜测,但也许有帮助。
【讨论】:
感谢 MF。那里有有用的信息,我将尝试这些技术,但值得注意的是它只有 %20 会破坏它,其他转义字符没有相同的效果。以上是关于为啥尾随 %20 (在这种情况下为有效数据)会杀死 asp.net mvc 路由的主要内容,如果未能解决你的问题,请参考以下文章