IHttpClientFactory并更改基本HttpClient.BaseAddress

问题描述 投票:1回答:1

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);
c# wpf dependency-injection dotnet-httpclient
1个回答
1
投票

在运行期间,有时需要更改BaseAddress。在运行期间,我无法在注入BaseAddress后对其进行更改。

BaseAddress可以更改直到发送第一个请求。此时,它已被锁定,无法再次更改。 HttpClient工厂模式假定每个注入的客户端只有一个BaseAddress(可能未设置)。

现在我可以完全忽略BaseAddress并只在API调用中发送整个地址,但是,我不知道这是否是正确的方法。

您的选择是:

  1. [定义多个客户端,每个BaseAddress一个。如果您有一些知名主机,这是正常的方法。
  2. 定义单个客户端,不要使用BaseAddress,而是在每个调用中传递整个url。这是完全允许的。
  3. 定义您自己的工厂类型,该工厂类型使用IHttpClientFactory传递HttpClient实例,其中每个实例可以指定自己的BaseAddress。仅当您有一些代码[[required a BaseAddress(例如Refit)但需要与动态主机一起使用时,我才会使用这种更复杂的方法。
© www.soinside.com 2019 - 2024. All rights reserved.