首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 實作斷點續傳:HTTP Range 請求完整解析與程式碼

     編輯:ASP.NET 基礎

斷點續傳原理

HTTP 協定中,客戶端可在請求標頭加入 Range: bytes=起始位置-,告知伺服器從指定位元組繼續傳輸。伺服器回應 206 Partial Content,並在回應標頭包含 Content-Range 與 Content-Length。

請求/回應範例

一般請求

GET /image/index_r4_c1.jpg HTTP/1.1
Host: 192.168.3.120:8080
Connection: Keep-Alive

回應

HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 2827
Accept-Ranges: bytes

斷點續傳請求(從 1024 位元組開始)

GET /image/index_r4_c1.jpg HTTP/1.1
Range: bytes=1024-

續傳回應

HTTP/1.1 206 Partial Content
Content-Type: image/jpeg
Content-Length: 1803
Content-Range: bytes 1024-2826/2827
Accept-Ranges: bytes

ASP.NET 實作關鍵步驟

  1. 偵測 Range 標頭:Request.Headers["Range"] != null
  2. 解析起始位置:long startPos = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Split('-')[0]);
  3. 設定回應狀態碼 206:Response.StatusCode = 206;
  4. 加入 Content-Range、Content-Length 標頭
  5. FileStream 定位至 startPos 並分塊輸出

完整程式碼範例

private void Page_Load(object sender, EventArgs e)
{
    string file = MapPath("ff.zip");
    FileInfo fi = new FileInfo(file);

    long startPos = 0;
    long fileTranLen = fi.Length;

    // 斷點續傳請求
    if (Request.Headers["Range"] != null)
    {
        Response.StatusCode = 206;
        startPos = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Split('-')[0]);
        fileTranLen -= startPos;

        Response.AddHeader("Content-Range", 
            string.Format("bytes {0}-{1}/{2}", startPos, startPos + fileTranLen - 1, fi.Length));
    }

    Response.AddHeader("Content-Length", fileTranLen.ToString());
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + fi.Name);

    using (FileStream fileStream = File.OpenRead(file))
    {
        fileStream.Position = startPos;
        byte[] buffer = new byte[1024];
        int count;
        while ((count = fileStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            Response.OutputStream.Write(buffer, 0, count);
        }
    }
    Response.End();
}

注意事項

  • 大檔案建議增加緩衝區大小(如 10KB~100KB)提升效能
  • 生產環境應加入 Response.IsClientConnected 檢查,客戶端中斷時停止傳輸
  • 支援多範圍請求(bytes=0-100,200-300)需更複雜的邏輯,本範例僅示範單一範圍
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved