c#-RedirectToRoute是对在routeValues中的URL参数中的“ /”进行双重编码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-RedirectToRoute是对在routeValues中的URL参数中的“ /”进行双重编码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1983字,纯文字阅读大概需要3分钟。
内容图文
我有一个编码问题,我似乎无法解决关于路由参数的问题.基本上,它要么从不对URL进行编码,要么对URL进行双重编码.我只希望它是单编码的!
这是我注册的路线:
routes.MapRoute("Scan", "Scan/{*url}", new { controller = "Scan", action = "Index" });
现在,我有一个控制器动作可以重定向到该路由.为了简单起见,假设它看起来像这样:
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%2fsearch”-请注意,正斜杠已经过两次编码.如果在重定向之前设置了断点,则可以看到UrlEncode方法成功将正斜杠编码为/.
似乎重定向正在编码“%”符号,而不是“ /”.如果我用通常使用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参数中的“ /”进行双重编码全部内容,希望文章能够帮你解决c#-RedirectToRoute是对在routeValues中的URL参数中的“ /”进行双重编码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。