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调用中发送整个地址,但是,我不知道这是否是正确的方法。
您的选择是:
BaseAddress
一个。如果您有一些知名主机,这是正常的方法。BaseAddress
,而是在每个调用中传递整个url。这是完全允许的。IHttpClientFactory
传递HttpClient
实例,其中每个实例可以指定自己的BaseAddress
。仅当您有一些代码[[required a BaseAddress
(例如Refit)但需要与动态主机一起使用时,我才会使用这种更复杂的方法。