我想为UserHttpClient中的每个方法设置一个默认标头,但我不希望每个方法都这样做,我想以一般方式进行。
我在当前实现中看到的问题是,当我调用一个方法时,_client被释放,因此在Http请求中的下一次调用中,_client没有被初始化,因为这发生在构造函数中。
根据Http Request,通过DI注册UserHttpClient。
我也不想创建一个私有/基本方法,我传递_client并在那里添加标题。
你会如何解决这个问题?
public class UserHttpClient : IUserRemoteRepository
{
private readonly string baseUrl = ConfigurationManager.AppSettings["baseUrl"];
private readonly string header = ConfigurationManager.AppSettings["userHeader"];
private readonly HttpClient _client;
public ServiceProductDataProvider(string toolSystemKeyHeader)
{
_client = new HttpClient();
_client.DefaultRequestHeaders.Add(header, token);
}
public async Task<List<UserDto>> GetUsers(UserRequestDto dto)
{
using (_client)
{
// do stuff
var users = await _client.GetAsync("url here");
}
}
public async Task<UserDto> GetUser(Guid userId)
{
using (_client)
{
// do stuff
var users = await _client.GetAsync("url here");
}
}
}
答案 0 :(得分:0)
班级UserHttpClient
的成员为IDisposable
(private readonly HttpClient _client;
)。这意味着UserHttpClient
也应该实现IDisposable
:
public void Dispose()
{
_client.Dispose();
}
然后,正在使用UserHttpClient
的类/代码负责在完成它之后对其进行处理。如果注入实例,那么您使用的DI框架可能会在请求结束时自动处理它。那么剩下的就是从实现中删除using
块:
public async Task<List<UserDto>> GetUsers(UserRequestDto dto)
{
// do stuff
var users = await _client.GetAsync("url here");
}
----编辑----
你也可以通过而不是重用HttpClient
解决问题:
private string _toolSystemKeyHeader;
public ServiceProductDataProvider(string toolSystemKeyHeader)
{
_toolSystemKeyHeader = toolSystemKeyHeader
}
private HttpClient GetClientInstance()
{
HttpClient _client = new HttpClient();
_client.DefaultRequestHeaders.Add(header, _toolSystemKeyHeader); //?? in your original code, the toolSystemKeyHeader is not used, but I guess it is the token..?
return _client;
}
和
public async Task<List<UserDto>> GetUsers(UserRequestDto dto)
{
using (var _client = GetClientInstance())
{
// do stuff
var users = await _client.GetAsync("url here");
}
}