案情背景

  目前公司做新项目,基本所有新项目都是用.net core来做,旧项目一半还是基于 .net framework下面,一半已经迁移到了core平台。在做新项目的时候,有个功能需要对接到旧项目那边的接口,功能也不复杂,就是对接接口的参数需要通过签名,然后进行MD5加密传输过去,旧项目那边也有相同的签名和加密方式,用来检验参数的正确性,听起来其实就是一种很简单传统的签名验证方式,却因为 “.net core 和 .net framework 下面编码不同” 导致走了很多弯路
在传参过程中,一直收到旧项目接口返回的“签名错误”的提示,刚开始以为是两者对应的签名方法不一致,但经过同事确认,签名方法是直接复制过来的,绝对没错(虽然我还是不信ㄟ( ▔, ▔ )ㄏ),为了证明他的结论是错的,我毅然在 .net framework下面建了个项目,然后同样的代码copy过去,当我run起来后,心里本来想可以美滋滋的过去扇他一嘴巴子。结果签名通过了,接口调用成功,这让我很是惆怅啊.........

肇事方法

  回头整理下,整个过程中,排除了业务方法后,最终最只有这个MD5加密的方法

     /// <summary>
/// MD5加密
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public static string MD5Encrypt(string context)
{
var bytes = Encoding.Default.GetBytes(context);
var md5Str = MD5.Create().ComputeHash(bytes);
return BitConverter.ToString(md5Str).Replace("-", "");
}

然后我把这个方法单独拿出来在两个平台上测试,发现结果确实不一样,心里莫名有种兴奋感,接下来定位到 Encoding.Default.GetBytes 这个方法,于是再测试了一次

这是.net core下面的结果

这是.net framework下面的结果

寻找真相

  发现到这里,我的第一反应其实是这样的

  接下来,百度和stackoverflow查一下,找不到答案,问了几个群,也没人遇到过。然后拿出了杀手锏,我亲爱的谷歌,可能提问方式不对,愣是找不到答案。最后,没办法了,是时候发挥一个程序员的精神了,咱自己看下源码吧,方正.net都是开源的。

第一步,看下.net core下面 Encoding.Default 这个对象的源码

  可以看到,.net core下面 Encoding.Default 默认就是获取了UTF8Encoding这个编码的

第二步,看下.net core下面 .net framework这个对象的源码

  可以看到,.net framework 是也有UTF8Encoding这个编码的,但是确是需要当  代码页标识符 为65001的时候才会命中(65001具体表示什么,等下再说到),这样看,难道是他们两个默认的 代码页标识符 不一样,瞬间感觉离真相越来越近了

第三步,看下他们的默认CodePage

.net framework

.net core

soga~~~果然不一样,于是查了下96365001对应的编码类型

  这下就清晰了,虽然同样都是用 Encoding.Default 的方法,但是由于.net framework 下面默认的是963(GB2312)的,.net core 下面是65001(UTF-8)的,所以才会导致相当的方法,跑出了不同的结果。

解决问题  

  知道原因了就好办了,由于旧系统的接口之前也会其他系统在对接,所以旧系统那边的签名是改不了的,只能改新的这边,于是只要在.net core 把 Encoding.Default 改作 Encoding.GetEncoding(“GB2312”),统一编码就可以了,然后兴高采烈的run起来,结果居然报错了,又一次被尴尬到,原来是.NET Core默认不支持GB2312了,所以需要在Starup.cs的Configure方法中加入Encoding.RegisterProvider(CodePagesEncodingProvider.Instance),就这样妥妥的跑稳了。

  

  好了,感觉是不是有点标题党,哈哈,其实就是想和大家分享下,也希望大家在.net core 上面遇到的问题也能分享下,可能只是个细节的问题,同样能帮助别人少才坑。

  然后顺便跟还在用.net framework的朋友说下,可以 稳稳地转.net core 了,我已经两年没写过文章了,这两年来一直在学,在用.net core ,在生产环境中已经稳稳的跑过.net core了,而且是在docker里面,而且是在k8s里面(当然linux和window上的就更不用说了)

一场关于 .net core 和 .net framework 编码的案情分析的更多相关文章

  1. .NET Core 和 .NET Framework 之间的关系

    引用一段描述:Understanding the relationship between .NET Core and the .NET Framework. .NET Core and the .N ...

  2. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  3. ASP.NET Core 开发 - Entity Framework (EF) Core

    EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ...

  4. [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

    前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...

  5. .Net Core vs .Net Framework 如何为一个应用程序选择一个运行时

    .Net Core是下一件大事吗?我已经使用了一段时间了,我倾向认为它是.事实上,我们推测,在2018年,对这项技术熟练的开发人员将会有巨大的需求.但是它和.Net Framework的区别是什么?你 ...

  6. .Net Core vs .Net Framework 如何为一个应用程序选择一个运行时(翻译)

    .Net Core是下一件大事吗?我已经使用了一段时间了,我倾向认为它是.事实上,我们推测,在2018年,对这项技术熟练的开发人员将会有巨大的需求.但是它和.Net Framework的区别是什么?你 ...

  7. .NET Core 和 .NET .Framework 速度比较

    废话不多说! 一下是 .NET core 和 .NET framework 速度对比. 两者使用最慢的冒泡排序算法:  排序10万条数据 次数 .NET CORE(耗时) .NET framework ...

  8. 【ASP.NET Core MVC 入门须知】Net Core和Net Framework 的区别

     1.简单介绍 从上面图中我们可以看到.net  主要分为三个部分 .net FrameWork,.net Core ,Xamarin XAMARIN  主要用来构建APP的主要用的是C#语言 .NE ...

  9. .net core .NET Core与.NET Framework、Mono之间的关系

    .NET Core与.NET Framework.Mono之间的关系 首先想要知道.NET Core与.NET Framework.Mono之间的关系,就必须他们分别是什么,有什么用途? 一. .ne ...

随机推荐

  1. java ajax请求后台并获取到返回值

    js: $.ajax({ url : '../Islogin.do', type : 'get', cache : false, dataType : 'json', success : functi ...

  2. MZOJ 1134: 二叉苹果树

    按书上大的,dfs还需加强 #include <bits/stdc++.h> #define read read() using namespace std; int read { ; c ...

  3. 核心一:IoC

    IoC 1.中文名称:控制反转 2.英文名称:(Inversion of Control) 3.IoC是什么? 3.1 IoC 完成的事情原先由程序员主动通过new 实例化对象事情,转交给Spring ...

  4. 2019.01.23 hdu3377 Plan(轮廓线dp)

    传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...

  5. 2019.01.02 NOIP训练 三七二十一(生成函数)

    传送门 生成函数基础题. 题意简述:求由1,3,5,7,9这5个数字组成的n位数个数,要求其中3和7出现的次数都要是偶数. 考虑对于每个数字构造生成函数. 对于1,5,9:∑nxnn!=ex\sum_ ...

  6. GreenPlum 初始化配置报错:gpadmin-[ERROR]:-[Errno 12] Cannot allocate memory

    报错原因:可能swap太小或者没有交换分区 解决方法: (1)查看swap:swapon -s (2)如果什么都没有显示,说明你没有任何可用的swap,此时你可以添加1GB的swap: dd if=/ ...

  7. java常用设计模式七:装饰模式

    一.概念 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为. 基本角色: 抽象构件:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的 ...

  8. idea中Eclipse Code Formatter插件设置和使用,以及注释模板的修改

    在settings里面找到plugins这个选项,搜索Eclipse Code Formatter,点击安装,重启idea即可进行配置: 首先,先安装Eclipse Code Formatter插件: ...

  9. VB6.0中WinSock控件属性和方法详解

    原文链接:http://liweibird.blog.51cto.com/631764/653134 WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器 ...

  10. 20155205 信息安全技术第二次实验 Windows口令破解

    20155205 信息安全技术第二次实验 Windows口令破解 实验原理 一.口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解,猜测其可能使用某些信息 ...