一場關於 .net core 和 .net framework 編碼的案情分析

来源:https://www.cnblogs.com/qtqq/archive/2019/04/05/10657776.html
-Advertisement-
Play Games

案情背景 目前公司做新項目,基本所有新項目都是用.net core來做,舊項目一半還是基於 .net framework下麵,一半已經遷移到了core平臺。在做新項目的時候,有個功能需要對接到舊項目那邊的介面,功能也不複雜,就是對接介面的參數需要通過簽名,然後進行MD5加密傳輸過去,舊項目那邊也有相 ...


案情背景

  目前公司做新項目,基本所有新項目都是用.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上的就更不用說了)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 死磕 java集合之TreeMap源碼分析(二) 紅黑樹插入元素的時間複雜度如何? 為什麼插入元素之後要做平衡? 以什麼樣的形式平衡最省時間? 如果插入元素的順序不一樣,會得到同樣的樹嗎? ...
  • 第三天學習內容 今日內容 1、整型(int) 2、布爾類型(bool) 3、字元串(str) 內容詳細 1、整型 Python中的整型用int表示。 1.python2中: 在32位機器上,整數的位數為32位,取值範圍為 2 31~2 31 1,即 2147483648~2147483647 在64 ...
  • 爬蟲常用庫urllib 註:運行環境為PyCharm urllib是Python3內置的HTTP請求庫 urllib.request:請求模塊 urllib.error:異常處理模塊 urllib.parse:url解析模塊 urllib.robotparse:robot.txt解析模塊 1、url ...
  • 1 package quicksort; 2 3 import org.junit.Test; 4 5 import java.util.Arrays; 6 7 public class QuickSort { 8 9 @Test 10 public void setUp() throws Exce... ...
  • 文章大綱 一、JSON介紹二、常見框架介紹與實戰三、Studio中GsonFormat插件使用四、項目源碼下載(含參考資料)五、參考文檔 一、JSON介紹 1. 簡介 JSON 的全稱是 JavaScript Object Notation,是一種輕量級的數據交換格 式。 2. 特點 (1)JSON ...
  • 本文將主要講述 的內部結構和實現邏輯,在看本文之前最好先瞭解一下 隊列鎖, 就是根據 隊列鎖的變種實現的,因為本身 比較複雜不容易看清楚他本身的實現邏輯,所以查看 隊列鎖的實現,可以幫助我們理清楚他內部的關係;關於隊列鎖的內容可以參考 , "CLH、MCS 隊列鎖簡介" ; 一、AQS 結構概述 在 ...
  • 上一篇小樂帶大家學過 Java8新特性-Lambda表達式,那什麼時候可以使用Lambda?通常Lambda表達式是用在函數式介面上使用的。從Java8開始引入了函數式介面,其說明比較簡單:函數式介面(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的 ...
  • 同步容器 在 Java 中,同步容器主要包括 2 類: Vector、Stack、HashTableCollections 類中提供的靜態工廠方法創建的類(由 Collections.synchronizedXxxx 等方法) Vector 實現了 List 介面,Vector 實際上就是一個數組, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...