c# - RestSharp 响应错误 : "Only one usage of each socket address (protocol/network address/port) is normally permitted"

标签 c# asp.net-core sockets asp.net-core-webapi restsharp

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

  1. 在我的应用程序中使用 RestSharp
  2. 在我的应用程序中使用了 Http 客户端

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

enter image description here

关于c# - RestSharp 响应错误 : "Only one usage of each socket address (protocol/network address/port) is normally permitted",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983030/

相关文章:

c# - 何时/如何注销 RegisteredWaitHandle

c# - MVC 6 中的 HtmlHelpers

asp.net-core - 在 NLog 目标中使用 ${basedir} 创建一个具有该名称的文件夹

C# Socket编程,关闭窗口

c - 两台64位机器之间的TCP套接字编程

c# - 列出 dll 中使用的命名空间

c# - 如何通过 ViewModel 转到 DataGrid 中的特定行号

c# - 如何使用反射创建或调用抽象类的 protected 构造函数?

asp.net-core - ASP.NET Identity 和 IdentityServer 有什么区别?

php - 终止从套接字服务器派生的僵尸子进程