網站首頁 編程語言 正文
背景介紹
本文的需求背景是對接蘋果公司的推送服務(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站點。
原文鏈接:https://www.cnblogs.com/chen943354/p/16454740.html
相關推薦
- 2023-01-17 CMakeList中自動編譯protobuf文件過程_C 語言
- 2022-03-14 Response to preflight request doesn't pass access
- 2022-06-15 C++?詳細講解stack與queue的模擬實現_C 語言
- 2023-01-15 盤點SqlServer?分頁方式和拉姆達表達式分頁_MsSql
- 2022-06-04 R語言批量讀取某路徑下文件內容的方法_R語言
- 2022-07-02 C語言由淺入深講解線程的定義_C 語言
- 2022-02-13 如何寫一個自己的strcpy函數
- 2022-04-09 SpringBoot自定義validation注解校驗參數只能為指定的值
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支