<httpRuntime><system.web>
<httpRuntime executionTimeout="9999" maxRequestLength="2097151" />
</system.web>
<security>若部署在 IIS 7 以上,還需在 Web.config 的 <system.webServer> 區段設定:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648" /> <!-- 單位 Bytes,2GB -->
</requestFiltering>
</security>
</system.webServer>
ASP.NET 預設會將整個請求內容緩衝在記憶體中,再交給處理器。超大檔案會導致:
OutOfMemoryExceptionHttpWorkerRequest 分塊讀取串流繞過 ASP.NET 內建緩衝,直接從 IIS 輸入管道讀取:
IServiceProvider provider = (IServiceProvider)HttpContext.Current;
HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[] preloaded = wr.GetPreloadedEntityBody(); // 取得已預載部分
if (!wr.IsEntireEntityBodyIsPreloaded())
{
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int read;
while ((read = wr.ReadEntityBody(buffer, bufferSize)) > 0)
{
// 將 buffer 寫入檔案串流、資料庫或轉發至其他服務
// 例如:fileStream.Write(buffer, 0, read);
}
}
ASP.NET 或 IIS_IUSRS 對上傳暫存資料夾有寫入權限。HttpModule 或 SignalR 回報上傳進度。