gpt4 book ai didi

c# - IHttpClientFactory 并更改基础 HttpClient.BaseAddress

转载 作者:行者123 更新时间:2023-12-03 23:06:42 24 4
gpt4 key购买 nike

IHttpClientFactory 和更改 HttpClient.BaseAddress 的最佳实践是什么?

在创建我的依赖注入(inject)时,我这样做是这样的:

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。在运行期间,我无法在注入(inject)后更改 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);

最佳答案

there are times, during runtime that the BaseAddress needs to change. During the run I am not able to change the BaseAddress after it has been injected.


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

Now I could ignore BaseAddress altogether and just send the entire address in the API call, however, I do not know if this is the correct way of doing it.



您的选择是:
  • 定义多个客户端,每个客户端一个 BaseAddress .如果您有一些知名主机,这是正常的方法。
  • 定义单个客户端,不要使用BaseAddress ,在每次调用中传递整个 url。这是完全允许的。
  • 定义您自己的使用 IHttpClientFactory 的工厂类型昏倒HttpClient每个实例都可以指定自己的实例BaseAddress .如果您有一些需要 BaseAddress 的代码,我只会使用这种更复杂的方法。 (例如, retrofit ),但需要与动态主机一起使用。
  • 关于c# - IHttpClientFactory 并更改基础 HttpClient.BaseAddress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62139681/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com