<httpRuntime maxRequestLength="..." /> 僅調整 IIS 允許上限,ASP.NET 仍會將整個檔案載入記憶體再處理。OutOfMemoryException、IIS 連線中斷、客戶端顯示「找不到伺服器」(無法在伺服端捕獲)。繞過 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);
}
}
IFormFile / MultipartReader 串流處理,無需額外套件。BeginRequest,偵測 multipart/form-data。HttpWorkerRequest 串流解析 MIME 區塊,直接寫入暫存檔。runAllManagedModulesForAllRequests="true" 或模組設定 preCondition=""。proxy_request_buffering 避免雙重緩衝。採用串流處理 + 成熟套件,才能穩健支援 GB 級大檔上傳。