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 截取的屏幕截图,显示了两个负载测试之间的差异。

  1. 我的应用使用 RestSharp
  2. 我的应用使用 Http 客户端

希望这对某人有所帮助。很遗憾我不得不放弃 RestSharp,因为它是一个不错的小库 - 不幸的是,遇到这样的问题,在生产环境中 运行 风险太大。