ASP.NET 無法上載大型檔案(大於 4MB)

Part I.

這個問題有許多朋友在開發 Web 應用程式常會遇到,常是檔案太大無法上傳時,會詢問為何無法上傳檔案?那裡出了問題?

根據預設,ASP.NET 只容許上載 4,096 KB (或 4 MB) 或以下的檔案到網頁伺服器中。如果要上載較大的檔案,您必須變更 Web.config 檔中 <httpRuntime> 區段的 maxRequestLength 參數。

注意 當 Machine.config 檔中設定了 maxRequestLength 屬性而後發佈超出 maxRequestLength 值的要求 (例如,檔案上載) 時,將無法顯示自訂錯誤網頁。Microsoft Internet Explorer 會顯示「找不到伺服器或 DNS」錯誤訊息作為替代。
如果您想要針對整台電腦而非僅針對此 ASP.NET 應用程式變更這個設定,就必須修改 Machine.config 檔。
根據預設, <httpRuntime> 元素會設為 Machine.config 檔中的下列參數:

<httpRuntime executionTimeout="90" maxRequestLength="4096" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" />

Machine.config 檔位於 \System Root\Microsoft.NET\Framework\Version Number\Config 資料夾中。

 

Part II.

等設定完成可以上傳較大檔案時,許多朋友會接著問:那上傳檔案大小是否有所限制?

理論上,檔案上載大小上限是相當 大的。然而,由於 ASP.NET 健康狀態監視的緣故,您無法在 ASP.NET 中上載極大的檔案。ASP.NET 工作者處理序具有 2 GB 的虛擬位址空間。然而,由於健康狀態監視及記憶體分散的原因,ASP.NET 工作者處理序只會使用稍微大於 1 GB 的空間。
在上載過程中, ASP.NET 會在記憶體中載入整個檔案,之後使用者才能將檔案儲存到磁碟。因此,可能會因 Machine.config 檔中 processModel 標籤的 memoryLimit 屬性而重新使用處理序。memoryLimit 屬性會指定 ASP.NET 工作者處理序在自動重新使用處理序前可以耗用的實體記憶體百分比。回收可防止記憶體遺漏導致 ASP.NET 當機或停止回應。

此外,其他因素也會影響可以上載的檔案大小上限。這些因素包括可用記憶體、可用硬碟空間、處理器速度,以及目前的網路流量。在一般上載檔案流量的情況下,Microsoft 建議您使用 10 到 20 MB 範圍內的檔案大小上限。如果您很少上載檔案,檔案大小上限可以是 100 MB。

注意 您可以在 ASP.NET 中上載大於 100 MB 的檔案。然而,Microsoft 建議您遵循本文中提到的檔案上載大小上限。如果要判斷更精確的檔案大小,請在與實際作業電腦環境類似的電腦上執行壓力測試。

如果您在檔案上載過程中遇到檔案大小限制,可能會注意到下列錯誤訊息:

無法顯示網頁。

伺服器應用程式無法使用

在事件記錄中,錯誤訊息會與下列訊息類似:

aspnet_wp.exe (PID:PIDNumber) 已回收,因為記憶體耗用超過 SizeLimit MB (Percentage % 的可用 RAM)。

已傳回類型 System.OutOfMemoryException 的例外狀況。

您也可能發現上載會進行得非常緩慢。如果您在「Windows 工作管理員」中查看 Aspnet_wp.exe 處理序,則會注意到記憶體差異每 1 到 2 秒就有 64 KB 的變更。視檔案大小的不同,這個延遲可能會因 responseDeadlock 錯誤而造成重新使用 ASP.NET 工作者處理序。

 

更多資訊:

如何在 ASP.NET 中使用 Visual Basic .NET 上載檔案到網頁伺服器

https://support.microsoft.com/kb/323245/zh-tw