[英]How to use HttpClientHandler with HttpClientFactory in .NET Core
[英].Net core HttpClientFactory how to dynamically add certificates
當注冊HttpclientFactory
,只能做證書注入startUp
。 有沒有辦法做動態注入?
services.AddHttpClient().ConfigurePrimaryHttpMessageHandler(() => {
var certificate = new X509Certificate2("", "", X509KeyStorageFlags.MachineKeySet);
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
return handler;
});
對於偶然發現這個問題的任何未來用戶,我有一個非常相似的需求,並且對默認 HttpClientFactory 實現的這種限制感到沮喪; 我有一個非常強大的 HttpClient 管道,Polly 和委托處理程序都鏈接在一起,但是需要使用的底層證書可能會根據特定的端點 URL 不同,而且我不一定要注冊四個或五個版本的不同類型客戶端的相同管道,我也不希望必須在組合根目錄中使用證書。 我編寫了一個庫來擴展 DefaultHttpClientFactory 以添加對上下文應用處理程序的支持,同時保留 DefaultHttpClientFactory 提供的池、到期和類型化客戶端管道。
DefaultHttpClientFactory 使用命名客戶端的名稱或類型化客戶端的類型名稱來唯一區分和跟蹤您在啟動時附加的管道和選項,以及生成的主處理程序在托管池中的名稱; 例如,類型化客戶端“MyTypedClient”將在名為“MyTypedClient”的池中具有主處理程序,將根據需要重新使用和更新。
通過裝飾 DefaultHttpClientFactory 使用的 HttpClientFactoryOptions IOptionsMonitor 並在處理程序管理過程中掛接在 IHttpMessageHandlerBuilderFilter 中,可以保持所有管道工作,但在池中創建和解析更細粒度的處理程序,即“MyTypedClient-contextA”、“MyTypedClient- contextB”,具有不同的上下文設置,例如不同的證書。 該庫只需要您實現幾個接口來區分這些上下文,然后在必須創建新上下文時為該上下文返回一個格式良好的主處理程序。
如果您的證書在每個請求中都不同或很少重用(因為您無論如何都會失去池的所有好處),這仍然不是理想的,但是如果您有一個開發良好的類型化客戶端管道,它具有不同的URL A 與 URL B(或用戶 A 與用戶 B 等)的證書,並且您相當頻繁地連接到它們,這可能會為您省去一些麻煩。 如果這對您有幫助,很高興收到任何反饋或評論。
您為ConfigurePrimaryHttpMessageHandler
傳遞的委托的調用取決於其生命周期(默認情況下為兩分鍾)。 因此,在該委托中,您實際上可以制作一個動態的證書列表(並且它會每兩分鍾調用一次 - 當您創建HttpClient
實例時)。
您可以使用SetHandlerLifeTime
(在AddHttpClient()
上的構建器上)選擇處理程序的生命周期,並根據需要選擇更短的時間跨度......但是,如果您多次需要為同一客戶端使用不同的處理程序,那就違背了整體使用HttpClientFactory
目的。
所以我看到三個選項:
相反,如果您的 http 客戶端“通常”使用相同的證書,並且它們只是在某個時間點發生變化......然后根據您的應用程序需求設置合理的生命周期(使用SetHandlerLifetime )。
如果您確實需要為每個請求(或每個實例)定義證書......那么不要使用HttpClientFactory
或任何其他客戶端池方法,因為您根本不想讓客戶端池化,並且您想要一個每個請求不同的(帶有自己的處理程序)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.