簡體   English   中英

IHttpClientFactory 並更改基礎 HttpClient.BaseAddress

[英]IHttpClientFactory and changing the base HttpClient.BaseAddress

IHttpClientFactory 和更改 HttpClient.BaseAddress 的最佳實踐是什么?

創建我的依賴注入時,我這樣做是這樣的:

services.AddHttpClient("MyApp", c =>
    {
        c.BaseAddress = new Uri("https://myurl/");
        c.DefaultRequestHeaders.Add("Accept", "application/json");
    }).ConfigurePrimaryHttpMessageHandler(handler => new HttpClientHandler()
    { AutomaticDecompression = DecompressionMethods.GZip });

然后當我需要一個 HttpClient 這樣做時:

var client = clientFactory.CreateClient("MyApp");

這很好用,但有時在運行時需要更改 BaseAddress。 在運行期間,我無法在注入后更改 BaseAddress。 現在我可以完全忽略 BaseAddress 並在 API 調用中發送整個地址,但是,我不知道這是否是正確的做法。 像這樣的東西:

await using var stream = await client.GetStreamAsync($"{addresss}/{api}");
using var streamReader = new StreamReader(stream);
using var textReader = new JsonTextReader(streamReader);
var serializer = new JsonSerializer();
data = serializer.Deserialize<List<T>>(textReader);

有時,在運行時 BaseAddress 需要更改。 在運行期間,我無法在注入后更改 BaseAddress。

在發送第一個請求之前,可以更改BaseAddress 此時,它被鎖定,無法再次更改。 HttpClient工廠模式假定每個注入的客戶端只有一個BaseAddress (可能未設置)。

現在我可以完全忽略 BaseAddress 並在 API 調用中發送整個地址,但是,我不知道這是否是正確的做法。

您的選擇是:

  1. 定義多個客戶端,每個BaseAddress一個。 如果您有一些知名主機,這是正常的方法。
  2. 定義一個客戶端並且不使用BaseAddress ,在每個調用中傳遞整個 url 。 這是完全允許的。
  3. 定義您自己的工廠類型,該工廠類型使用IHttpClientFactory傳遞HttpClient實例,其中每個實例都可以指定自己的BaseAddress 如果您有一些需要BaseAddress的代碼(例如 Refit)但需要將其與動態主機一起使用,我只會使用這種更復雜的方法。

暫無
暫無

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

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