首页 > 解决方案 > C#中的.net HttpClient:重新实例化时出现异常

问题描述

我正在查询具有数千个请求的多个 API。因此,我正在遍历端点和请求。正如建议重用 HttpClient 实例一样,这就是我正在做的事情。但是,我需要在每个 API 的标头中设置一些参数,例如超时、密码等。因此,第一个 API 可以完美运行,当尝试为下一个 API 设置参数时,它会失败:

此实例已启动一个或多个请求。只能在发送第一个请求之前修改属性。

一般来说,我知道在发出任何请求之前需要设置属性。因此,我考虑为每个 API 重置 HttpClient,然后将其重新用于对该 API 的数千个请求。令人惊讶的是,我得到了同样的错误——我完全不知道为什么。

这是关于代码的样子:

private HttpClient ApiClient;
private List<Api> Endpoints;
[...]
foreach(Api api in this.Endpoints)
{
    this.ApiClient = new HttpClient();
    this.ApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(api.mediaType));
    this.ApiClient.Timeout = TimeSpan.FromMinutes(api.timeout);
    this.ApiClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", api.credentials);
    
    foreach (string url in api.urls)
    {
        # retrieve data from APIs and do something with it
    }
}

如前所述,第一个循环工作得很好。但是当它从第二个 api 重新开始时,当我尝试设置 ApiClient 的超时值时,我会收到带有上述错误消息的 System.InvalidOperationException。

为什么这样?我创建了一个全新的 HttpClient 实例。有没有更好的方法来重置 HttpClient?

标签: c#.netdotnet-httpclient

解决方案


生成 HttpClients 的首选方式似乎是 httpfactory:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1 。另请注意,即使没有您的特定异常,恢复 httpclients 也可能会导致问题,因为您的代码似乎能够遇到套接字耗尽,如https://docs.microsoft.com/en-us/dotnet/中所述架构/微服务/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests


推荐阅读