每当客户端向我的ASPASCore3.1API发出请求时,我希望使用HttpClient在其他服务中执行一些操作。
我用依赖注入注册了HttpClient:
services.AddHttpClient<MyHttp>();不幸的是,这个HttpClient的BaseAddress不是静态的。取而代之的是,客户端发送一个自定义标头,其中包括对数据库条目的引用。因此,为了确定我的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 => {})不支持异步操作(我知道对象初始化应该是快速和可靠的)。
但我觉得我目前的解决方案也是一种糟糕的做法。有没有更好的方法来做这件事?
发布于 2021-03-13 20:18:13
没错,服务集合注册不支持异步工厂-因为服务解析应该总是快速的。
但是在客户端创建后初始化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;
}
}https://stackoverflow.com/questions/66613039
复制相似问题