C# Httpclient正在计算多个url远程文件大小
我想计算1000+url的总文件大小。 当任务运行时,我想显示当前的数量和总数。 但是,如果我将添加您可以在我的代码中看到的信息,我将得到错误ssl 这就是我得到的错误: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
"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;