如何判断请求是否支持断点续传?MP3下载前的HTTP头检测问题
解决HttpWebRequest无法获取206状态码判断断点续传的问题
嘿,这个问题我之前也碰到过!你现在拿到200状态码是因为默认的请求是获取完整资源,服务器自然返回200。要触发206 Partial Content(断点续传的标志),你得主动告诉服务器你要请求资源的一部分——也就是发送Range请求头。
核心原理
服务器返回206的前提是:你发送了一个指定资源范围的请求。如果只是发送普通的GET请求,无论服务器是否支持断点续传,都会返回200(完整资源)。另外,服务器支持断点续传的明确标志是响应头中包含 Accept-Ranges: bytes,这个字段比状态码更直接。
修改后的代码示例
下面是调整后的代码,通过添加Range请求头来验证断点续传支持:
using System; using System.Net; class Program { static void Main(string[] args) { string urlstring = "你的MP3文件URL"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlstring); // 关键:添加Range请求头,请求从字节0开始的1个字节(最小范围请求) request.AddRange(0, 0); try { using (WebResponse response = request.GetResponse()) { var httpResponse = (HttpWebResponse)response; Console.WriteLine($"当前状态码: {httpResponse.StatusCode}"); // 双重验证是否支持断点续传 bool supportsResumption = false; // 验证1:状态码为206(Partial Content) if (httpResponse.StatusCode == HttpStatusCode.PartialContent) { supportsResumption = true; } // 验证2:响应头包含Accept-Ranges: bytes string acceptRangesHeader = httpResponse.Headers["Accept-Ranges"]; if (!string.IsNullOrEmpty(acceptRangesHeader) && acceptRangesHeader.Equals("bytes", StringComparison.OrdinalIgnoreCase)) { supportsResumption = true; } Console.WriteLine($"该资源是否支持断点续传: {supportsResumption}"); } } catch (WebException ex) { // 处理服务器不支持范围请求的情况 if (ex.Response is HttpWebResponse errorResponse) { Console.WriteLine($"请求错误,状态码: {errorResponse.StatusCode}"); if (errorResponse.StatusCode == HttpStatusCode.RequestedRangeNotSatisfiable) { Console.WriteLine("服务器不支持指定的范围请求,说明不支持断点续传"); } } else { Console.WriteLine($"请求异常: {ex.Message}"); } } } }
关键说明
- Range请求头:通过
request.AddRange(0, 0)告诉服务器只请求第0到第0字节的内容(仅1字节),这样既不会浪费带宽,又能触发服务器的范围响应。 - 双重验证:同时检查206状态码和
Accept-Ranges响应头,确保结果更可靠——有些服务器可能支持断点续传,但在特定场景下不会返回206(比如资源本身小于请求的范围),但Accept-Ranges字段会明确说明支持。 - 异常处理:如果服务器不支持范围请求,会返回416(Requested Range Not Satisfiable)状态码,这时候可以直接判定不支持断点续传。
内容的提问来源于stack exchange,提问作者eomer
相关产品推荐
相关产品推荐

