簡體   English   中英

使用工廠方法創建類型化的HTTP客戶端ASP.NET Core 2.1

[英]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>(...) -我可以自己做所有這些事情。 但是作為懶惰的開發人員……我什至不想結束這句話。 內部有很多注冊,所以對我來說這是很大的不。

升級到ASP.NET Core 2.2

與上一點有關-在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

自定義HTTP處理程序設置請求標頭

與現在注冊ResponseMonitorHandler方式相同,我可以注冊可訪問IAccessTokenCache並設置請求授權標頭的HTTP處理程序。

但是同樣,與第一種情況一樣,這會取消HTTP客戶端的配置。 同樣,如果我有幾個不同的訪問令牌,我要么需要實現幾個HTTP處理程序,要么做一些邏輯,根據請求屬性來決定要使用緩存中的哪個令牌。

最后,問題 :還有其他我沒有考慮的方法嗎? 在ASP.NET 2.1中是否有簡單的解決方案? (...當然只是2.2版中的復制粘貼方法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM