考虑到使用 HttpClient 的众所周知的困境和问题 - 即套接字耗尽和不尊重 DNS 更新,最好的做法是使用 IHttpClientFactory 并让容器决定何时以及如何利用 http 池连接效率。这一切都很好,但现在我无法在每个请求上使用自定义数据实例化自定义 DelegatingHandler。
下面的示例说明了我在使用工厂方法之前是如何做到的:
public class HttpClientInterceptor : DelegatingHandler
{
private readonly int _id;
public HttpClientInterceptor(int id)
{
_id = id;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// associate the id with this request
Database.InsertEnquiry(_id, request);
return await base.SendAsync(request, cancellationToken);
}
}
Run Code Online (Sandbox Code Playgroud)
每次实例化 HttpClient 时,都可以传递一个 Id:
public void DoEnquiry()
{
// Insert a new enquiry hypothetically
int id = Database.InsertNewEnquiry();
using (var http = new HttpClient(new HttpClientInterceptor(id))) …Run Code Online (Sandbox Code Playgroud)