The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

ASP.NET 當上傳檔案過大時任何回應瀏覽器的動作都無效

基本的 HTTP 通訊協定就是 Browser 對 Server 發出 HTTP Request 指令,Server 收到 HTTP Request 指令後開始進行資料的運算與處理,然後從 Server 回應 HTTP Response 給 Browser,Browser 收到 HTTP Response 指令後負責處理網頁的顯示或網頁轉向等動作。

所以當你透過 HTTP 上傳過大的檔案時,雖然 ASP.NET 程式有開始執行,但是只要執行到 ASP.NET 設定的 maxRequestLength 上限時,就會將此次的 HTTP 對話直接關閉 ( 斷線 ),導致 Browser 無法完成 HTTP Request 這個動作,所以連 HTTP Request 都沒有完成的情況下,怎麼可能還從 Server 那邊得到 HTTP Response 指令!所以 Browser 根本不知道如何處理接下來的動作,這時如果你是使用 Internet Explorer 瀏覽器的話,就會出現 IE 預設的錯誤訊息 ( 請檢查您的網際網路連線。嘗試瀏覽其他網站,確定您已連線至網際網路。 ),使用者會感覺上好像 Server 端的程式出錯了,但是其實是 Browser 無法處理 HTTP 指令才導致這個畫面的出現。

所以你寫的任何要回應給 Browser 的程式都是沒有用的 ( 例如:  Response.Redirect("Error.htm"); ),Browser 完全接收不到喔!! 也因此這問題不只在 ASP.NET 會發生,在其他的 Web 應用平台都會有類似的問題,但這說穿了也不應該是個問題,你只要了解 HTTP 的運作機制,就不難了解為什麼會這樣!

寫程式最重要的就是基礎觀念有沒有紮實學好! 沒有好的觀念無法真正寫好程式,但問題遇到了解決不了或無法理解大部分的時候是正常的,反正多看書、多寫程式就會多學到一點經驗。

一般來說 ASP.NET 預設的檔案上傳限制為 4096 (4 MB),如果要調大檔案上傳的限制必須要調整 web.config 中在 <system.web> 區段下新增一個 <httpRuntime> 設定。例如我們要將上傳限制調整為 20MB 的話 (20MB = 20 * 1024KB = 20480KB),可以參考以下設定:

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="20480" executionTimeout="300"/>
  </system.web>
</configuration>

相關網址