RestSharp 响应错误:“通常只允许每个套接字地址(协议/网络地址/端口)使用一次”

gri*_*ohn 2 c# sockets restsharp asp.net-core asp.net-core-webapi

我正在使用 RestSharp 与 .Net Core Web API 进行通信。客户端和服务器都是我写的。

我有一套服务,全部继承一个基类,其中包含一个通过 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}");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,RestClient(与 HttpClient 不同)是线程安全的,每次都可以创建一个新实例。

当对我的应用程序进行负载测试时,当我达到某一点时,我发现我偶尔会收到来自 API 的以下响应。刷新页面可能会返回正确的结果,或者我可能会收到另一个错误。负载测试完成后,一切都会恢复正常。负载测试的数字并不疯狂,所以它开始让我担心现实生活中的性能......

通常只允许每个套接字地址(协议/网络地址/端口)使用一次

相信这是由于端口耗尽造成的。API 和客户端都作为应用程序服务在 Azure 中运行。

我尝试将 RestClient 作为单例服务的一部分,并检查它是否只创建一次 - 但这并没有缓解问题。

我还考虑过将启动类的 Startup 函数中的 DefaultConnectionLimit 从默认值 (2) 设置为 12,但我在这里也没有看到任何改进。

我真的很努力想知道如何改进这一点......

gri*_*ohn 6

找到了这个的原因...

目前,RestSharp 似乎存在一个问题,即套接字连接不会立即关闭,而是处于TIME_WAIT状态。

此问题目前由 RestSharp 人员记录在此处 ->

https://github.com/restsharp/RestSharp/issues/1322

我选择切换到使用 HttpClient - 并运行完全相同的负载测试,我遇到了零问题。

以下是从 Azure 获取的屏幕截图,显示了两个负载测试之间的差异。

  1. 我的应用程序使用 RestSharp
  2. 在我的应用程序中使用 Http Client

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

在此输入图像描述