[英]ASP.NET Core 2.1: Add client certificate to registered typed HTTP clients
[英]Using factory method to create typed HTTP client, ASP.NET Core 2.1
我正在遵循有關在我的應用程序中注冊HTTP客戶端的指南/文檔。 我需要打電話給幾個服務,所以我決定使用“類型客戶”。
為了調用另一個服務,我需要使用OAuth-因為這是服務到服務的調用,所以當我獲取訪問令牌時,我會對其進行緩存+我已經設置了令牌的定期刷新。 這意味着還有另一個組件IAccessTokenCache
,它為我提供了服務的訪問令牌。
我正在努力弄清的是如何注冊和配置鍵入的HTTP客戶端, IAccessTokenCache
它也依賴於IAccessTokenCache
。
我正在使用ASP.NET Core 2.1(重要細節,請繼續閱讀)。
HTTP客戶端包裝看起來像這樣(來自: ASP.NET Core 2.1(第2部分)中的HttpClientFactory ):
public class ServiceFooClient
{
public ServiceFooClient(HttpClient client)
{
Client = client;
}
public HttpClient Client { get; }
}
這就是我注冊和配置客戶端的方式:
services
.AddHttpClient<ServiceFooClient>(
c =>
{
c.BaseAddress = new Uri("https://www.foo.svc");
// TODO: grab particular access token from cache
c.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "...");
})
.AddHttpMessageHandler<ResponseMonitorHandler>()
.ConfigureHttpMessageHandlerBuilder(
b =>
{
var handler =
b.AdditionalHandlers.OfType<ResponseMonitorHandler>().FirstOrDefault();
if (handler != null)
{
handler.ServiceName = "Foo Service";
}
});
...我已經在配置HTTP客戶端,甚至添加了自定義HTTP處理程序。 您可以看到要訪問IAccessTokenCache
確切點,但是我不能。
ServiceFooClient
包裝器中配置基礎HttpClient
,例如: // ctor
public ServiceFooClient(HttpClient httpClient, IAccessTokenCache tokenCache)
{
Client = httpClient;
Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenCache.GetToken("Foo"));
}
這可以很好地工作,除非我不進行配置解耦-突然,專用的HTTP客戶端在Startup
中配置了一部分(基本URI,其他HTTP處理程序),在包裝類中又配置了一部分(設置授權標頭)。
AddHttpClient
擴展方法(及其他) 我真的不需要調用HttpClientFactoryServiceCollectionExtensions.AddHttpClient<T>(...)
-我可以自己做所有這些事情。 但是作為懶惰的開發人員……我什至不想結束這句話。 內部有很多注冊,所以對我來說這是很大的不。
與上一點有關-在2.1中,不會接受將接受服務提供者回調的AddHttpClient
(2.2: AddHttpClient<TClient>(this IServiceCollection services, Action<IServiceProvider, HttpClient> configureClient)
)的重載。 升級到2.2可能是最好的解決方案,但是我必須確保沒有其他問題(並且我已經知道BC中斷了/在HTTP上下文中獲取/設置請求跟蹤ID)。 這可能有潛在的風險,所以我首先嘗試解決2.1范圍內的問題。
將2.1的分支與2.2進行比較: HttpClientFactoryServiceCollectionExtensions
與現在注冊ResponseMonitorHandler
方式相同,我可以注冊可訪問IAccessTokenCache
並設置請求授權標頭的HTTP處理程序。
但是同樣,與第一種情況一樣,這會取消HTTP客戶端的配置。 同樣,如果我有幾個不同的訪問令牌,我要么需要實現幾個HTTP處理程序,要么做一些邏輯,根據請求屬性來決定要使用緩存中的哪個令牌。
最后,問題 :還有其他我沒有考慮的方法嗎? 在ASP.NET 2.1中是否有簡單的解決方案? (...當然只是2.2版中的復制粘貼方法)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.