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

ASP.NET 大檔案上傳解決方案:HttpWorkerRequest 串流處理

     編輯:.NET 實例教學

傳統上傳瓶頸

  • <httpRuntime maxRequestLength="..." /> 僅調整 IIS 允許上限,ASP.NET 仍會將整個檔案載入記憶體再處理。
  • 大檔案導致 OutOfMemoryException、IIS 連線中斷、客戶端顯示「找不到伺服器」(無法在伺服端捕獲)。

核心解法:HttpWorkerRequest 串流讀取

繞過 ASP.NET 預設載入機制,直接從 IIS 命名管道分塊讀取實體內容。

關鍵代碼

IServiceProvider provider = (IServiceProvider)HttpContext.Current;
HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));

byte[] preloaded = wr.GetPreloadedEntityBody(); // 已預載部分
// 直接處理 preloaded...

if (!wr.IsEntireEntityBodyIsPreloaded()) {
    const int chunkSize = 1024 * 64; // 64KB
    byte[] buffer = new byte[chunkSize];
    int received;
    while ((received = wr.ReadEntityBody(buffer, chunkSize)) > 0) {
        // 寫入檔案串流、資料庫、雲端儲存...
        outputStream.Write(buffer, 0, received);
    }
}

成熟開源方案推薦

  • NeatUpload:HttpModule 實作,支援進度條、串流寫入磁碟、限流、多檔上傳。
  • Ajax Uploader / FineUploader:客戶端分片上傳 + 伺服端合併,體驗最佳。
  • ASP.NET Core:內建 IFormFile / MultipartReader 串流處理,無需額外套件。

Chris Hynes 經典架構 (ASP.NET Upload Magic)

  1. HttpModule 攔截 BeginRequest,偵測 multipart/form-data。
  2. 使用 HttpWorkerRequest 串流解析 MIME 區塊,直接寫入暫存檔。
  3. Session / Cache 記錄進度(已接收位元組),前端輪詢進度 API 顯示 ProgressBar。
  4. 上傳完成後觸發事件,由業務邏輯搬移/處理檔案。

注意事項

  • IIS 7+ 整合模式需註冊 runAllManagedModulesForAllRequests="true" 或模組設定 preCondition=""。
  • 反向 Proxy (Nginx/ARR) 需關閉 proxy_request_buffering 避免雙重緩衝。
  • 安全性:驗證檔案簽名 (Magic Number)、限制副檔名、掃毒、儲存於非執行目錄。

採用串流處理 + 成熟套件,才能穩健支援 GB 級大檔上傳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved