[英]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 调用中发送整个地址,但是,我不知道这是否是正确的做法。
您的选择是:
BaseAddress
一个。 如果您有一些知名主机,这是正常的方法。BaseAddress
,在每个调用中传递整个 url 。 这是完全允许的。IHttpClientFactory
传递HttpClient
实例,其中每个实例都可以指定自己的BaseAddress
。 如果您有一些需要BaseAddress
的代码(例如 Refit)但需要将其与动态主机一起使用,我只会使用这种更复杂的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.