我正在使用 RestSharp 与 .Net Core Web API 进行通信。 Client和Server都是我写的。
我有一套服务都继承了一个基类,基类包含一个通过 RestClient 执行请求的异步方法。这是创建 RestClient 的基类中的方法。
private async Task<ServiceResponse> RequestAsync(ServiceRequest request)
{
try
{
var result = await new RestClient(_digiCore.Config.GetApiBaseUrl()).ExecuteTaskAsync(request.Request, request.CancellationTokenSource.Token);
switch (result.StatusCode)
{
case HttpStatusCode.OK:
case HttpStatusCode.Created:
case HttpStatusCode.NoContent:
return new ServiceResponse
{
Code = ServiceResponseCode.Success,
Content = result.Content
};
// User wasn't authenticated for this one - better luck next time!
case HttpStatusCode.Unauthorized:
Logger.LogError($"Unauthorized {request.Method.ToString()}/{request.Path}");
default:
Logger.LogError($"An error occurred {request.Method.ToString()}/{request.Path}");
}
}
catch (Exception e)
{
Logger.LogError($"A Rest Client error occurred {request.Method.ToString()}/{request.Path}");
}
}
我的理解是 RestClient(与 HttpClient 不同)是线程安全的,每次都可以创建一个新实例。
当对我的应用程序进行负载测试时,当我达到某个点时,我发现我偶尔会从 API 收到以下响应。刷新页面可能会返回正确的结果,或者我可能会遇到另一个错误。负载测试完成后,一切恢复正常。负载测试的数字并不疯狂,所以它开始让我担心现实生活中的性能......
Only one usage of each socket address (protocol/network address/port) is normally permitted
我相信这是因为端口耗尽。 API 和客户端都作为应用服务在 Azure 中运行。
我曾尝试将 RestClient 作为单例服务的一部分,并检查它是否只创建了一次 - 但这并没有缓解问题。
我还研究了将启动类的 Startup 函数中的 DefaultConnectionLimit 从默认值 (2) 设置为 12,但我也没有看到任何改进。
我真的很想知道如何改进它......
最佳答案
找出原因...
RestSharp 目前似乎存在一个问题,套接字连接不会立即关闭,而是处于TIME_WAIT 状态。
此问题目前由 RestSharp 人员记录在此处 ->
https://github.com/restsharp/RestSharp/issues/1322
我选择切换到使用 HttpClient - 并运行完全相同的负载测试,我遇到了零个问题。
这是从 Azure 截取的屏幕截图,显示了两个负载测试之间的差异。
- 在我的应用程序中使用 RestSharp
- 在我的应用程序中使用了 Http 客户端
希望这对某人有所帮助。很遗憾我不得不放弃 RestSharp,因为它是一个不错的小库 - 不幸的是,遇到这样的问题,它在生产环境中运行风险太大。
关于c# - RestSharp 响应错误 : "Only one usage of each socket address (protocol/network address/port) is normally permitted",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983030/