【发布时间】:2020-01-02 18:03:39
【问题描述】:
我正在尝试使用 Flurl 作为我的 HTTP 客户端库版本 2.4.2 来查询公共 NPPES NPI 注册表。
在 4-5 次成功的异步请求(通过单步执行循环中的每个请求进行调试)后,它总是会失败,并出现 SocketException 表示连接被强制关闭。我假设 API 是速率受限的,但减慢请求似乎不起作用。这是我的相关代码。
static async Task<Result> GetNpiEntry(string npiNumber)
{
var npiEntry = await "https://npiregistry.cms.hhs.gov"
.AppendPathSegment("api/")
.SetQueryParams(new { version = "2.1", number = npiNumber }).GetJsonAsync<RootObject>();
return npiEntry.results[0];
}
循环调用它并在请求之间进行大量睡眠。
List<Result> npiResults = new List<Result>(npiTable.Rows.Count);
foreach (DataRow row in npiTable.Rows)
{
Result npiEntry = Task.Run(() => GetNpiEntry((string)row[0])).Result;
npiResults.Add(npiEntry);
Thread.Sleep(2000);
}
这是实际的例外。
---> System.Net.Http.HttpRequestException: An error occurred while sending the request.
---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..
---> System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host.
我是否有更合适的方式来调试或执行此操作? 我想我需要对客户端进行速率限制,但是请求之间的宽大等待时间至少对于调试来说不应该起作用吗?
【问题讨论】:
-
欢迎来到 Stack Overflow!感谢您在问题中发布代码和详细的错误信息,这样更容易回答。 :)
-
你能不能让你的
Task.Runlambdaasync然后await调用GetNpiEntry。即:Task.Run( async ( ) => await GetNpiEntry -
@WBuck 我无法添加,因为它无法编译,foreach 循环位于
static void Main(string[] args) {}入口点内。在 Task.Run() 调用之前添加另一个睡眠允许它在遇到此错误之前完成约 1000 个请求,但它仍然会遇到此错误。 -
我正在发布答案,请稍等
-
Wbuck 的回答是正确的。我在我的中添加了一些细节和复制。希望这对@tNAPA 有帮助!
标签: c# .net-core async-await flurl