c# - 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?
解决方案
生成 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。
推荐阅读
- java - 请求范围 bean 中的请求范围 bean
- html - iframe“(站点名称)拒绝连接。” 错误
- windows - 是否可以将 UI 自动化作为 Windows 服务运行?
- angular - 如何取消阻止 Angular 应用程序中的字体 - CORS 错误
- php - 使用 PDO 缓慢连接到 Postgresql
- javascript - 如何在弧形闪电图中仅禁用缩放交互
- regex - 为什么这个模式不匹配
- excel - Excel VBA – 根据 D 列的输入更新 BF 列单元格
- angular - Angular / Firebase / Typescript 接口 - 如何使用 toDate() 管理 firebase.firestore.FieldValue 的接口类型
- asp.net-core - 为什么我会收到此警告:“@Model.property”不是“已检查”属性的有效值?