【问题标题】:ASP .NET Core DI: Provide async BaseAddress to HTTP clientASP .NET Core DI:向 HTTP 客户端提供异步 BaseAddress
【发布时间】:2021-06-11 05:55:07
【问题描述】:

每当客户端向我的 ASP .NET Core 3.1 API 发出请求时,我想使用 HttpClient 在其他服务中执行一些操作。

我用依赖注入注册了HttpClient:

services.AddHttpClient<MyHttp>();

不幸的是,这个HttpClientBaseAddress 不是静态的。相反,客户端发送一个自定义标头,包括对数据库条目的引用。 因此,为了确定我的 HttpClient 的 BaseAddress,我需要对我的数据库进行异步调用。

目前我正在执行以下操作:

public class SomeController
{
    public SomeController(MyHttp http, AddressRepository db)
    {
        _http = http;
        _db = db;
    }
    public async Task<dynamic> SomeAction([FromRoute] string id)
    {
        var address = await _db.Get(id);
        _http.BaseAddress = new Uri(address);
        var res = await _http.GetAsync("some-path");
        //Handle response and do some business-logic
        return new { };
    }
}

这可行,但每当我在任何服务中使用 MyHttp 时,我都需要确保该服务设置了 BaseAddress 属性。
我宁愿提供地址作为构造函数参数。 首先,我想到了工厂实现。但是services.AddScoped(serviceProvider =&gt; {}) 不支持异步操作(而且我知道对象初始化应该快速可靠)。

但我觉得我目前的解决方案也是一种不好的做法。有没有更好的方法呢?

【问题讨论】:

  • 您也许可以添加一个委托处理程序并在异步的 Send 方法中添加您的逻辑。在 AddHttpClient 调用之上添加处理程序还有其他扩展方法。不确定如何使用基地址

标签: c# asp.net-core dependency-injection factory-pattern


【解决方案1】:

没错,服务集合注册不支持异步工厂——因为服务解析应该总是很快的。

但是在客户端创建后初始化baseAddress并没有错。因此,如果您想确保使用正确的基地址初始化 httpClient,如何将该逻辑提取到单独的类中以构建您的 http 客户端配置?

public YourHttpClientFactory {
    private IHttpClientFactory _factory;

    public YourHttpClientFactory(IHttpClientFactory factory)
    {
        _factory = factory;
    }

    public Task<HttpClient> Create(Guid id) {
        var client = factory.createClient();
        // do your async client initialization
        return client;        
    }
}

【讨论】:

  • 感谢您的回复。但是有了这样的解决方案,我无法想象如何使用依赖注入来实现它。因为在一个范围(一个用户请求)中,将有多个服务使用此上下文(此范围的一个特定 baseAddress)。如果所有这些服务都使用HttpFactory.Create(),我将有很多实例。
  • 我是否正确地说您在请求范围内的所有服务都应该使用相同的baseAddress?如果是这样,您可以在自定义中间件中执行 baseAddress 初始化,例如注册一个命名的http客户端,在中间件中解析它并根据请求信息执行初始化,管道中的所有服务都将使用预配置的httpclient。
猜你喜欢
  • 2017-08-31
  • 2021-05-16
  • 1970-01-01
  • 2017-12-15
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多