擷取“請求實體太大”錯誤
我正在執行 Web 伺服器 IIS 8.0 並使用 ASP.NET 和 C#。
我有一個上傳框,使用者可以在其中將文件上傳到伺服器,在大約 50MB 的限制之後,白頁上會出現一條消息:
The page was not displayed because the request entity is too large.
我想顯示一個對使用者更友好的頁面,並以紅色顯示“嘗試上傳文件時出錯,請聯繫我們尋求幫助”。
在處理上傳按鈕點擊事件時的程式碼隱藏文件中,我添加了:
try { //try to save the file to server } catch(Exception ex) { //otherwise, set the asp:Label tag text to display error }
但是,該
catch
語句中的程式碼並未執行。我的猜測是錯誤可能出在 IIS 上,並且無法用該程式碼語句擷取。有沒有辦法攔截該錯誤並顯示更友好的錯誤頁面?感謝您的幫助。
如果上傳的文件大於 IIS 允許的大小,它永遠不會到達 ASP.NET 執行時,並且您的異常處理是無用的。
您應該將 uploadReadAheadSize 設置為遠高於您希望允許的值,理想情況下僅適用於特定 URL。然後檢查程式碼中的上傳大小並顯示您自己的消息。
如果使用者上傳的文件比 uploadReadAheadSize 大,他/她仍然會收到 IIS 消息,但這種情況下,如果您使用大數字,則可能性要小得多。
這裡有很多解決方案/評論,但都沒有解決基本問題。什麼實體太大了?我們遇到了同樣的問題,我們最終確定錯誤的實體是 ASPX 頁面中的視圖狀態對象。僅僅使 maxBufferPoolSize、maxBufferSize 和 maxReceivedMessageSize 的大小變得非常大並不是真正正確的解決方案。它會起作用,但你只是掩蓋了問題,它會在未來的某個時候發生。
ViewState Web 應用程序是無狀態的。這意味著每次我們向伺服器發出請求以獲取頁面時都會創建一個新的頁面實例,並且在往返之後我們的頁面立即失去。它只是因為一台伺服器而發生,網頁的所有控制項都已創建,並且在往返之後伺服器會銷毀所有實例。因此,為了保留控制項的值,我們使用狀態管理技術。視圖狀態是在往返之間保留頁面和控制項值的方法。它是一種頁面級狀態管理技術。預設情況下,視圖狀態處於打開狀態,並且通常會序列化頁面上每個控制項中的數據,而不管它是否在回發期間實際使用。
解決方案 我們的網頁顯示了一個記錄的網格視圖,根據使用者請求可以訪問底層數據查詢視圖中的每條記錄。隨著記錄被添加到該視圖之外的表中,Gridview 數據集變得太大,以至於 ASPX 頁面無法保存和呼叫 viewstate 對象。我們的解決方案是了解為什麼需要整個數據集的業務原因,結果證明通常只需要最近 7 天的數據,任何更早的時間都需要一份常備報告來滿足。一旦理解了這一點,我們就簡單地修改了頁面查詢以限制最近 7 天的數據,公佈更改並通知使用者。問題已解決。