繁体   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