gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:28:09 25 4
gpt4 key购买 nike

我有一个编码问题,我似乎无法掌握有关路线参数的问题。基本上,它要么从不 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com