目前公司作新項目,基本全部新項目都是用.net core來作,舊項目一半仍是基於 .net framework下面,一半已經遷移到了core平臺。在作新項目的時候,有個功能須要對接到舊項目那邊的接口,功能也不復雜,就是對接接口的參數須要經過簽名,而後進行MD5加密傳輸過去,舊項目那邊也有相同的簽名和加密方式,用來檢驗參數的正確性,聽起來其實就是一種很簡單傳統的簽名驗證方式,卻由於 「.net core 和 .net framework 下面編碼不一樣」 致使走了不少彎路
在傳參過程當中,一直收到舊項目接口返回的「簽名錯誤」的提示,剛開始覺得是二者對應的簽名方法不一致,但通過同事確認,簽名方法是直接複製過來的,絕對沒錯(雖然我仍是不信ㄟ( ▔, ▔ )ㄏ),爲了證實他的結論是錯的,我毅然在 .net framework下面建了個項目,而後一樣的代碼copy過去,當我run起來後,內心原本想能夠美滋滋的過去扇他一嘴巴子。結果簽名經過了,接口調用成功,這讓我非常惆悵啊.........linux
回頭整理下,整個過程當中,排除了業務方法後,最終最只有這個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 這個方法,因而再測試了一次docker
這是.net core下面的結果ide
這是.net framework下面的結果測試
發現到這裏,個人第一反應實際上是這樣的編碼
接下來,百度和stackoverflow查一下,找不到答案,問了幾個羣,也沒人遇到過。而後拿出了殺手鐗,我親愛的谷歌,可能提問方式不對,愣是找不到答案。最後,沒辦法了,是時候發揮一個程序員的精神了,咱本身看下源碼吧,方正.net都是開源的。加密
能夠看到,.net core下面 Encoding.Default 默認就是獲取了UTF8Encoding這個編碼的spa
能夠看到,.net framework 是也有UTF8Encoding這個編碼的,可是確是須要當 代碼頁標識符 爲65001的時候纔會命中(65001具體表示什麼,等下再說到),這樣看,難道是他們兩個默認的 代碼頁標識符 不同,瞬間感受離真相愈來愈近了.net
.net framework 的3d
.net core 的
soga~~~果真不同,因而查了下963和65001對應的編碼類型
這下就清晰了,雖然一樣都是用 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上的就更不用說了)