如何在.Net Framework應用中請求HTTP2站點

2022-07-07 18:02:56

背景介紹

本文的需求背景是對接蘋果公司的推播服務(APNS),蘋果在安全方面比較積極,已經嚴格限制API只支援HTTP2。但是我這裡的應用目前仍然是.NET Framework平臺,所以必須尋找一種解決方案。本文在調研及驗證後,將相關資料整理出來供大家參考。

什麼是HTTP2及依賴條件

HTTP/2(超文字傳輸協定第2版,最初命名為HTTP 2.0),簡稱為h2(基於TLS/1.2或以上版本的加密連線)或h2c(非加密連線)[1],是HTTP協定的的第二個主要版本,使用於全球資訊網。

多數主流瀏覽器已經在2015年底支援了該協定。[9]此外,根據W3Techs的資料,截至2021年10月,全球有46.5%的網站支援了HTTP/2。

劃重點:HTTP2依賴的TLS協定版本號必須大於等於1.2,因此後文就分別針對Windows系統、Net Framework框架對HTTP2、TLS1.2的支援情況來梳理。

Windows 對HTTP2的支援情況?

調研結論:需要Windows Server 2016或者Windows 10及更高版本。

參考資料:https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/http2-on-iis

Windows對TLS1.2的支援情況?

結論:Windows 8.1、Windows Server 2012 R2、Windows 10、Windows Server 2016 和更高版本的 Windows 在本機支援 TLS 1.2。

參考資料:https://docs.microsoft.com/zh-cn/mem/configmgr/core/plan-design/security/enable-tls-1-2-client

 

.Net Framework對HTTP2的支援情況?

結論:不支援!但是有解決方案:安裝nuget包System.Net.Http.WinHttpHandler

參考資料:https://github.com/dotnet/runtime/issues/31217

nuget包介紹如圖所示:

根據簡介可以得知:該nuget包是將Windows系統的WinHTTP介面封裝,也就是說程式發起HTTP請求是通過Windows實現,而不是HttpClientHandler。而根據前面的調研,Windows對HTTP2和TLS1.2的支援情況已經非常明確。

.Net Framework對TLS1.2的支援情況?

結論:框架.Net Framework 4.6.2及以上支援tls1.2

參考資料:https://docs.microsoft.com/zh-cn/mem/configmgr/core/plan-design/security/enable-tls-1-2-client

核心程式碼片段

現在確保Windows系統能夠滿足最低要求 ,即可編寫測試應用來驗證請求。下面是程式碼片段,我在Windows Server 2016+.NET Framework 4.8環境可以請求成功。

try
{
    string url = "https://api.push.apple.com" + (":443") + "/3/device/" + appleDeviceToken;
    var req = new HttpRequestMessage(HttpMethod.Post, url);
    req.Version = new Version(2, 0);
    req.Content = new JsonContent("{}");
    var resp = httpClient.SendAsync(req).Result;
    string respContent = resp.Content.ReadAsStringAsync().Result;
    this.outputBox.Text += respContent;
}
catch (Exception ex)
{
    this.exceptionBox.Text = ex.ToString();
}

總結

隨著各大瀏覽器支援和蘋果的帶頭效應,HTTP2的應用會越來越廣泛,但是規模龐大的.NET Framework應用卻也不能為了連線HTTP2就升級到NET Core平臺。通過本文提供的方案,可以最小成本的實現.NET Framework應用成功存取HTTP2站點。