C# Httpclient正在计算多个url远程文件大小

C# Httpclient正在计算多个url远程文件大小,c#,.net-5,C#,.net 5,我想计算1000+url的总文件大小。 当任务运行时,我想显示当前的数量和总数。 但是,如果我将添加您可以在我的代码中看到的信息,我将得到错误ssl 这就是我得到的错误: "Unhandled exception. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> System.IO.IOExceptio

我想计算1000+url的总文件大小。 当任务运行时,我想显示当前的数量和总数。 但是,如果我将添加您可以在我的代码中看到的信息,我将得到错误ssl

这就是我得到的错误:

    "Unhandled exception. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
 ---> System.IO.IOException:  Received an unexpected EOF or 0 bytes from the transport stream.
   at System.Net.Security.SslStream.ReceiveBlobAsync[TIOAdapter](TIOAdapter adapter)
   at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Boolean receiveFirst, Byte[] reAuthenticationData, Boolean isApm)
   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Boolean async, Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Boolean async, Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.SendAsyncCore(HttpRequestMessage request, HttpCompletionOption completionOption, Boolean async, Boolean emitTelemetryStartStop, CancellationToken cancellationToken)"
你能建议一下什么是显示计数的最佳方式吗

 #region GET REMOTE FILE SIZE
public static async Task<string> GetRemoteFileSize(this List<string> urls) {
    long sum = 0;
    long localSum = 0;
    var tasks = new List<Task<long?>>();
    for(int i = 0; i < urls.Count; i++) {
        var url = urls[i];
        tasks.Add(GetTotalBytes(url));
        //if i will add here the counts, it's not getting the actual count
        Console.Title = $"{i} of {urls.Count}";
    }
    
    for (int i = 0; i < tasks.Count; i++) {
        Task<long?> task = tasks[i];
        localSum += Convert.ToInt32(await task.ConfigureAwait(false));
        Console.Title = $"{i} of {urls.Count}"; //if I will add this, I'm getting the SSL error even if I already added this " ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }," to my httpclient handler
    }
    await Task.WhenAll(tasks.ToArray()).ConfigureAwait(false);
    return Interlocked.Add(ref sum, localSum).FormatFileSize();
}
private static async Task<long?> GetTotalBytes(string url) {

    Uri uri = new Uri(url, UriKind.Absolute);
    uri.SetServiceManagerConnection();

    using var request = new HttpRequestMessage(HttpMethod.Head, uri);
    request.AddAllCommonHeaders(uri);
    using var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
    HttpStatusCode statusCode = response.StatusCode;

    if (!response.IsSuccessStatusCode) {
        throw new InvalidDataException($"Error occured: {statusCode} {(int)statusCode}");
    }

    return response.Content.Headers.ContentLength.GetValueOrDefault();
}
#endregion GET REMOTE FILE SIZE
更新: 当HTTPS出现TLS握手错误时,此错误是典型的。 您应该指定SecurityProtocol

System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;
参考号:

已更新: 当HTTPS出现TLS握手错误时,此错误是典型的。 您应该指定SecurityProtocol

System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;

参考:

正如其他人所提到的,您正在收到TLS错误

一旦您解决了这个问题,您正在执行的操作的一个更快的方法将是HTTP
HEAD
,它只返回到您可以看到大小的头

请注意:并非所有服务器都允许
HEAD
,尤其是AWS

此问题的答案显示了如何使用
HttpClient

正如其他人所提到的,您正在收到TLS错误

一旦您解决了这个问题,您正在执行的操作的一个更快的方法将是HTTP
HEAD
,它只返回到您可以看到大小的头

请注意:并非所有服务器都允许
HEAD
,尤其是AWS

此问题的答案显示了如何使用
HttpClient

您到底遇到了什么错误?您好。我已经添加了错误。。。内部异常是什么?错误已被更新,因此,看起来远程端切断了您的连接(当您期待SSL握手时,返回了0字节)。我不认为我们还有什么可以补充的。你到底犯了什么错误?嗨。我已经添加了错误。。。内部异常是什么?错误已被更新,因此,看起来远程端切断了您的连接(当您期待SSL握手时,返回了0字节)。我想我们没有什么可以补充的了。也许这是不允许的。但是如果我使用GET,计算我看到的总长度将需要更多的时间。也许这是不允许的。但是如果我使用GET,计算总长度将需要更多的时间
System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;