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 上載檔案到網頁伺服器

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

Comments (4)

  1. Chinese_XU says:

    关于PartI

    是否存在不修改Machine.config文件但又可以重新设置最大上传字节限制的方法?

    比如在Web.config中使用相应的<clear/>或者<remove/>?

    毕竟Machine.config是整个服务器的定义。

  2. jchiou says:

    謝謝你的問題。這個問題問的太好了。

    補充如下:

    我們可以使用下列其中一種方法來解決這個問題:

    1. 在 Machine.config 檔案中,將 <httpRuntime> 設定區段的 maxRequestLength 屬性變更為較大的值。這個變更對整個電腦都有影響。

    2. 在 Web.config 檔案中,覆寫應用程式 maxRequestLength 的值。這樣影響的範圍即為這個應用程式。

    希望有回答到你的問題,謝謝

    Jacky

  3. reita says:

    我想問一下的是 爲什麽我的計算機向網絡硬盤上載文件時候的非常慢 adsl 2M沒理由慢到3,4k/秒啊

    Jacky大大知道的話請指教 謝謝

  4. jchiou says:

    謝謝你/妳的問題。

    關於這個問題仍有許多疑點需要釐清:

    ADSL 2M 為download 或 upload 的速度?

    請問您在 Web Server 上直接使用

    http://localhost/WebSite/Upload.aspx 的方法上傳文件的速度為何?

    在 IIS 上是否有做一些特殊設定?

    建議可以用一些比對的方式,來區分這個問題是屬於網路問題或是IIS 設定問題或是程式問題,等確認問題點後,再深入探討造成的原因。

    Hope this help.

    Regards,

    Jacky

Skip to main content