gpt4 book ai didi

c# - 在服务之间共享 HttpClient

转载 作者:行者123 更新时间:2023-12-05 06:18:14 25 4
gpt4 key购买 nike

我正在开发一个 Blazor 项目,为了让我更容易理解这个问题,我们可以说我正在使用两种不同的服务来处理身份验证部分。它们与命名的 httpclient 一起在 configureservices 启动方法中注册。

services.AddHttpClient("XBOWServicesApi", c =>
{
c.BaseAddress = new Uri(XBOWServicesApi);
});

services.AddSingleton<IService1, Service1>();
services.AddSingleton<IService2, Service2>();

服务 1:包装 REST Api 中可用的所有功能。它使用通过实例化的 httpclientfactory 在构造函数中设置的 http 客户端。这需要使用 baseurl 和 Auth-header 进行设置才能工作。

public Service1(IHttpClientFactory clientFactory)
{
this.httpClient = clientFactory.CreateClient("XBOWServicesApi");
}

服务 2:使用自定义 AuthenticationStateProvider 处理登录/注销功能。它有自己的 httpclient,因此我可以为 http 客户端设置 Auth Header。构造函数的工作方式与服务 1 相同。

public Service2(IHttpClientFactory clientFactory)
{
this.httpClient = clientFactory.CreateClient("XBOWServicesApi");
}

这种构建的原因当然是我喜欢共享同一个 http 客户端,所以当它在登录/注销方法中设置时,服务 1 在与 api 通信时将具有正确的 auth header 。

但是,客户端工厂每次都会提供一个新实例,所以这永远行不通。

任何想法如何处理这个?

/亨里克

最佳答案

您可以使用命名客户端:

services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("https://api.github.com/");
// Github API versioning
c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
// Github requires a user-agent
c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

之后,只需调用CreateClient方法,并传入相应的name参数即可。

var client = _clientFactory.CreateClient("github");

每次调用 CreateClient 时:

  • 创建了一个新的 HttpClient 实例。
  • 配置 Action 是打电话。

您可以在 Microsoft 文档中找到更多详细信息 here .

关于c# - 在服务之间共享 HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61321250/

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