使用C# (.NET Framework 4.7.2)无法从指定URL下载文件
解决.NET Framework 4.7.2下载文件时“基础连接已关闭”的问题
问题概述
使用.NET Framework 4.7.2编写控制台程序,尝试下载指定HLS manifest文件时,出现错误:Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden..(英文翻译:The underlying connection has been closed: Unexpected error while sending..)。该文件可在Firefox中正常下载,但HttpClient和WebClient两种实现方式均失败。
解决方案
目标服务器(Boltdns/Fastly)对请求头、TLS协议支持有严格校验,以下是修正后的代码:
1. HttpClient 修正代码
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; // .NET Framework 4.7+推荐使用SystemDefault,让系统自动适配TLS版本,同时显式兼容TLS1.2/1.3 ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; // 启用100-continue握手,适配CDN服务器要求 ServicePointManager.Expect100Continue = true; using (var client = new HttpClient()) { // 添加Firefox浏览器的User-Agent,避免被服务器拦截 client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0"); var response = client.GetByteArrayAsync("https://manifest.prod.boltdns.net/manifest/v1/hls/v4/aes128/1324209225001/41f5d925-9942-471c-8916-da9d45a92898/10s/master.m3u8?fastly_token=NjQ1ZDYwMGVfNWNhOTM0ODNkZjlmNzM5NWJjYTU5MDA4Mzg0MTlmNzFkYWNmODIxNmQwNzQ3ZjMxNDU0MTJjYTA3YmI4YzM5MQ%3D%3D").Result; File.WriteAllBytes("myfile.m3u8", response); }
2. WebClient 修正代码
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; ServicePointManager.Expect100Continue = true; using (var wc = new WebClient()) { wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0"); var bytes = wc.DownloadData("https://manifest.prod.boltdns.net/manifest/v1/hls/v4/aes128/1324209225001/41f5d925-9942-471c-8916-da9d45a92898/10s/master.m3u8?fastly_token=NjQ1ZDYwMGVfNWNhOTM0ODNkZjlmNzM5NWJjYTU5MDA4Mzg0MTlmNzFkYWNmODIxNmQwNzQ3ZjMxNDU0MTJjYTA3YmI4YzM5MQ%3D%3D"); File.WriteAllBytes("myfile.m3u8", bytes); }
关键调整说明
- TLS协议设置:使用
SecurityProtocolType.SystemDefault让系统自动匹配服务器支持的TLS版本,同时显式指定Tls12和Tls13,避免旧协议被拒绝。 - User-Agent头:模拟浏览器请求标识,部分CDN会拦截无标识或默认.NET标识的请求。
- Expect100Continue:启用该设置适配部分CDN的握手校验要求,解决连接中断问题。
注:目标URL有效期至2023年5月13日,过期后token失效。
内容的提问来源于stack exchange,提问作者esp
相关产品推荐
相关产品推荐

