You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断请求是否支持断点续传?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:09:08