WebClient在负载下调用时给出“10048:通常只允许使用每个套接字地址的一种”

问题描述

我正在使用较旧的WebClient,并在致电System.Net.sockets.socketException时得到以下WebClient.UploadString

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

这是调用WebClient.UploadString代码

public bool UploadString(Uri endpoint,string accesstoken,string data)
{
    var url = endpoint.AbsoluteUri;

    using (var webClient = new WebClient())
    {
        ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 
        webClient.Encoding = Encoding.UTF8;
        webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
        webClient.Headers[HttpRequestHeader.Authorization] = $"Bearer {accesstoken}";
        webClient.UseDefaultCredentials = true;
        
        var exceptionData = "";
        try
        {
            webClient.UploadString(endpoint,"POST",data);
        }
        catch (Exception exception)
        {
            exceptionData = $"  Failed - {exception?.Message}";

            // Exception logging code removed for brevity.

            return false;
        }
    }

    return true;
}

我正在parallel.foreach循环中调用代码,最大并行度为10:

private void StartQueueProcessor()
{
   Task.Factory.StartNew(() =>
   {
      var parallelOptions = new ParallelOptions{MaxDegreeOfParallelism = 10 };
      Parallel.ForEach(_logQueue.GetConsumingPartitioner(),parallelOptions,queueItem =>
      {
          // Make call to UploadString method above

似乎可以处理大约120,000个电话。然后它开始失败并显示错误

.Net Core 3.1的呼叫速率约为600每秒,.Net 4.8的呼叫速率约为200每秒。

有没有一种方法可以使套接字快用完电话呢?

注意:由于线程和异步问题,我无法使用HttpClient。 (我花了一个星期或更长时间来尝试完成这项工作。)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)