c# - RedirectToRoute 在参数中对 "/"进行双重编码,这些参数是 routeValues 中的 URL

标签 c# model-view-controller encoding routes

我有一个编码问题,我似乎无法掌握有关路线参数的问题。基本上,它要么从不 URL 编码,要么加倍 URL 编码。我只想对它进行单一编码!

这是我注册的路线:

routes.MapRoute("Scan", "Scan/{*url}", new { controller = "Scan", action = "Index" });

现在我有一个重定向到该路由的 Controller 操作。为了简单起见,假设它看起来像这样:

var url = "troyhunt.com/search";
return RedirectToRoute("Scan", new { url });

生成的 URL 是“Scan/troyhunt.com/search”——请注意,.com 之后的正斜杠没有被转义。

现在让我们再试一次,但应用 URL 编码:

var url = HttpUtility.UrlEncode("troyhunt.com/search");
return RedirectToRoute("Scan", new { url });

这次生成的 URL 是“Scan/troyhunt.com%252fsearch”——请注意正斜杠已经过双重编码。如果我在重定向之前设置断点,我可以看到 UrlEncode 方法成功地将正斜杠编码为 %2f。

看起来重定向编码的是“%”符号而不是“/”。如果我使用通常使用 URL 编码 (?,=) 转义的其他字符进行测试,则编码可以直接从 RedirectToRoute 方法正常工作。这可能是将斜杠视为分隔路线段因此不转义的问题吗?我在这里还漏掉了什么吗?

更新:To route or not to route, that is the question 中讨论了更多信息、评论和解决方法.

最佳答案

查看 System.Web.Routing 看起来这是因为路由值不是使用 HttpUtility.UrlEncode(value) 进行 URL 编码但实际上是使用“转义” Uri.EscapeUriString(value)

违规代码在 System.Web.Routing.ParsedRoute 中:

// Dev10 601636 Work around Uri.EscapeUriString not encoding #,&
    private static string UrlEncode(string str) {
        string escape = Uri.EscapeUriString(str); 
        return Regex.Replace(escape, "([#;?:@&=+$,])", new MatchEvaluator(EscapeReservedCharacters));
    }

可能是 设计决定(必须向 Microsoft 人员询问),因为正斜杠是路由中不可或缺的一部分。如果是,我觉得它有点奇怪,因为 documentation for Uri.EscapeUriString()指出它的主要用途是:

Use the EscapeUriString method to prepare an unescaped URI string to be a parameter to the Uri constructor.

按照生成路由 URL 的代码,它似乎根本没有使用 Uri 类 - URL 是在字符串中构造和返回的。

如果您将它作为查询字符串参数传递,而不是作为指定路由的一部分,它将被正确地进行 URL 编码(但当然会改变您的 URL 的结构)。

关于c# - RedirectToRoute 在参数中对 "/"进行双重编码,这些参数是 routeValues 中的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7319105/

相关文章:

python - 在cx_Oracle/UnicodeDecodeError中设置查询结果编码为汉字

java - URLConnection URL 包含重音字符的编码问题

c# - 当我尝试通过 WinRT 对象从 C++ 调用回调到 C# 时如何解决此 E_POINTER (NullPointerException)?

c# - 从 catch block 中跳出 for 循环

C# IEnumerator/yield 结构可能不好?

c# - 抽象模型的 Asp.Net Core 2.0 (MVC) Content Binder

ios - 在 View Controller 之间传递数据

model-view-controller - MVC 与 3 层架构?

Javascript简单MVC+模块模式实现

java - 如何将电子邮件另存为文本