RestSharp Response error: "Only one usage of each socket address (protocol/network address/port) is normally permitted"
RestSharp Response error: "Only one usage of each socket address (protocol/network address/port) is normally permitted"
我正在使用 RestSharp 与 .Net Core Web 进行通信 API。 Client和Server都是我写的
我有一套服务都继承了一个 Base class,它包含一个通过 RestClient 执行请求的异步方法。这是基础 class 中创建 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 作为单例服务的一部分,并检查它是否只创建了一次 - 但这并没有缓解问题。
我还研究了在启动 class 的启动函数中将 DefaultConnectionLimit 从默认值 (2) 设置为 12,但我也没有看到任何改进。
我真的很想知道如何改进它...
找到原因了...
RestSharp 目前似乎存在一个问题,即套接字连接不会立即关闭,而是留在 TIME_WAIT 状态。
此问题目前由 RestSharp 人员记录在此处 ->
https://github.com/restsharp/RestSharp/issues/1322
我选择切换到使用 HttpClient - 并且 运行使用完全相同的负载测试我遇到了零个问题。
这是从 Azure 截取的屏幕截图,显示了两个负载测试之间的差异。
- 我的应用使用 RestSharp
- 我的应用使用 Http 客户端
希望这对某人有所帮助。很遗憾我不得不放弃 RestSharp,因为它是一个不错的小库 - 不幸的是,遇到这样的问题,在生产环境中 运行 风险太大。
我正在使用 RestSharp 与 .Net Core Web 进行通信 API。 Client和Server都是我写的
我有一套服务都继承了一个 Base class,它包含一个通过 RestClient 执行请求的异步方法。这是基础 class 中创建 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 作为单例服务的一部分,并检查它是否只创建了一次 - 但这并没有缓解问题。
我还研究了在启动 class 的启动函数中将 DefaultConnectionLimit 从默认值 (2) 设置为 12,但我也没有看到任何改进。
我真的很想知道如何改进它...
找到原因了...
RestSharp 目前似乎存在一个问题,即套接字连接不会立即关闭,而是留在 TIME_WAIT 状态。
此问题目前由 RestSharp 人员记录在此处 ->
https://github.com/restsharp/RestSharp/issues/1322
我选择切换到使用 HttpClient - 并且 运行使用完全相同的负载测试我遇到了零个问题。
这是从 Azure 截取的屏幕截图,显示了两个负载测试之间的差异。
- 我的应用使用 RestSharp
- 我的应用使用 Http 客户端
希望这对某人有所帮助。很遗憾我不得不放弃 RestSharp,因为它是一个不错的小库 - 不幸的是,遇到这样的问题,在生产环境中 运行 风险太大。