为啥尾随 %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 路由的主要内容,如果未能解决你的问题,请参考以下文章

为啥在这种情况下只有回溯有效?

基于另一列向数据框添加列索引(在这种情况下为用户)

为啥列表中允许使用尾随逗号?

如何显示在这种情况下为 1 的第一站?

为啥在 Laravel 的这种情况下 route() 有效?

systemd为啥会kill进程