.NET Core里的UrlEncode之坑

当我们在.NET Core中处理URL编码的时候,有两个API可以选择:System.Net.WebUtility.UrlEncode 和 System.Web.HttpUtility.UrlEncode。他们有什么区别,我们又该选择哪个?我做了一些研究,本文是我的一些发现。

01

测试结果

首先,我们来看看测试。我测试了2对WebUtilityHttpUtility里相同的方法:

UrlEncode/UrlDecode 以及 HtmlEncode/HtmlDecode

唯一有区别的是UrlEncode(string)返回了不同的结果:

var webencode = System.Net.WebUtility.UrlEncode(test);

var httpencode = System.Web.HttpUtility.UrlEncode(test);

Console.WriteLine($"WebUtility.UrlEncode: {webencode}");

Console.WriteLine($"HttpUtility.UrlEncode: {httpencode}");

针对需要被编码的字符,WebUtility.UrlEncode()返回了大写,而HttpUtility.UrlEncode()返回的是小写

02

这TM是怎么回事

感谢微软开源了.NET,我们能够通过查看.NET Core的源代码发现原因,源代码戳这里:https://github.com/dotnet/corefx

如果你想亲眼看看的话,代码路径如下:

WebUtility类

\corefx\src\System.Runtime.Extensions\src\System\Net\WebUtility.cs

HttpUtility类

\corefx\src\System.Web.HttpUtility\src\System\Web\HttpUtility.cs

WebUtility

我在408行找到了UrlEncode方法(行号可能会变,如果微软修改了源代码)

它会调用GetEncodedBytes()方法

而这里面又会调用IntToHex()方法

最终,我们能够发现,因为强转了一个大写字符'A',所以任何被编码的字符都会输出为大写。

HttpUtility

我对HttpUtility做了相同的分析,最终发现它调用了System.Web.Util.IntToHex()方法,代码如下:

这就解释了为啥它返回的总是小写字符。

我的猜想

我不知道这是否为刻意设计的,但有两个版本的IntToHex()方法让我比较懵逼。我更希望API能给调用者提供一个可选参数用来控制输出字符的大小写。

03

那么该选哪个方法呢?

简而言之,我自己的系统里全部使用小写URL。所以我会选择使用HttpUtility.UrlEncode()去编码URL。

在Windows系统里,URL的大小写是无所谓的。但是Linux里是不一样的,大小写不一致可能让你遇到404。而且,大写字符和小写字符的HASH是不一样的,如果你的系统里有某个地方通过HASH来校验URL,那么大小写问题会导致校验失败。

说到SEO的话,有些人可能认为小写是更加SEO友好的,但实际上URL大小写在Google这里是不影响排名的。不信可以看看论坛:

https://productforums.google.com/forum/#!topic/webmasters/ky1L_dj4n5c/discussion (嗯,好像这是个不存在的网站)

关键在于,你需要在自己的系统里保证URL大小写规则一致,并且留意与你的系统对接的其它系统,是否用了不同的URL大小写处理方式。

本文分享自微信公众号 - 汪宇杰博客(ediwangblog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云服务器999+

腾讯云CDN接入教程

https://cloud.tencent.com/redirect.php?redirect=1042&cps_key=6f5f5aedea72d213ca3...

92620
来自专栏前端下午茶

前端路由跳转基本原理

目前前端三杰 Angular、React、Vue 都推介单页面应用 SPA 开发模式,在路由切换时替换 DOM Tree 中最小修改的部分 DOM,来减少原先因...

29720
来自专栏深度应用

[个人网站搭建]·Django增加评论功能(Python3)

个人主页--> https://xiaosongshine.github.io/

16940
来自专栏云服务器999+

腾讯云特大优惠活动上线产品3折起新用户更有2860优惠券可领取

腾讯云活动上线啦,凡完成腾讯云官网注册且完成实名认证的国内站用户均可参与。活动期间,除了可以参加每天5场的秒杀活动外,还有代金券大礼包可以领取,同时,云服务器、...

13940
来自专栏Jerry的SAP技术分享

SAP Cloud Platform创建Destination时Additional properties属性的维护

Values for the WebIDEUsage property determine how the SAP Web IDE interprets the...

12630
来自专栏呼延

短url服务的设计以及实现

最理想的情况是: 我们用一种算法,对每一个长URL,唯一的转换成短URL.还能保持反向转换的能力.

27020
来自专栏Jerry的SAP技术分享

SAP Cloud Connector里的virtual host和internal host有什么区别

在创建系统映射时,我遇到了下面的两组字段:virtual host和internet host。

10840
来自专栏快乐学Python

爬虫入门:网络请求分析

摘要:看到有不少爬虫新手都是一头扎进代码里,一通乱弄,最后,跑通从大佬那里拿到的代码,嘿嘿嘿,抓到了数据结果,然后就没有然后,后面一出问题就又一脸懵逼,恢复到”...

9320
来自专栏诸葛青云的专栏

用python带你爬取小视频,看完“身体一天不如一天”

另外,关于python编程学习,小编给大家提供一个学习交流裙,欢迎到访:六一 一,五三零,一零一

19250
来自专栏Java系列文章

Spring Security 表单登录

本文将重点介绍使用 SpringSecurity登录。 本文将构建在之前简单的Spring MVC示例之上,因为这是设置Web应用程序和登录机制的必不可少的。

14510

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励