IIS 在上傳大文件和使用 TLS 時隨機返回 413 Request Entity Too Large
我有一個在 IIS 上執行的 ISAPI 應用程序,它旨在支持上傳任何大小的文件。在一台伺服器上,使用 HTTPS 時,上傳似乎隨機失敗
413 Request Entity Too Large
或超時,唯一的補救措施似乎是設置uploadReadAheadSize
一個大於上傳文件的值。但是,這會將上傳文件的大小限制為 2GB(的最大值uploadReadAheadSize
),這是不可接受的。
- Windows Server 2012(和相應的 IIS 版本)
- 伺服器不需要客戶端證書(但客戶端可能 - 並且出乎意料地 - 發送它們?!)
uploadReadAheadSize
在安裝了相同應用程序並且設置為預設值(49152 字節)的任何其他伺服器(並且有很多)上都不會出現此問題。- IIS返回錯誤,不涉及WAF或類似的中間組件。
- 從任何主機發送時都會發生錯誤,包括從伺服器主機本身發送。
- 使用瀏覽器客戶端和胖客戶端(本機 Windows 應用程序)上傳時會發生錯誤。
- 縮短請求正文實際上確實可以防止錯誤發生。
- 相同的請求可能失敗或成功(例如,當使用 Fiddler 重放時)
什麼可能導致這種情況,我應該如何進行調試?
(注意:我在 StackOverflow 和這裡看到了幾個類似的問題,但在這些情況下,要麼是使用客戶端證書,要麼是應用程序基於 WCF——我們的不是——或者問題不是獨立於
uploadReadAheadSize
或TLS)此外,什麼是了解
uploadReadAheadSize
實際做什麼以及“幕後”發生了什麼的好來源?微軟的官方文件相當稀少。
使用 Visual Studio 2017 在 IIS Express 上遇到類似錯誤,實際上是
uploadReadAheadSize
.錯誤:
HTTP 錯誤 413.0 - 請求實體太大
由於請求實體太大,頁面未顯示。
最可能的原因:
- Web 伺服器拒絕為請求提供服務,因為請求實體太大。
- Web 伺服器無法為請求提供服務,因為它正在嘗試協商客戶端證書,但請求實體太大。
- 請求 URL 或 URL 的物理映射(即 URL 內容的物理文件系統路徑)太長。
你可以嘗試的事情:
- 驗證請求是否有效。
- 如果使用客戶端證書,請嘗試:
+ 增加 system.webServer/serverRuntime@uploadReadAheadSize + 配置您的 SSL 端點以協商客戶端證書作為初始 SSL 握手的一部分。(netsh http 添加 sslcert …clientcertnegotiation=enable) .vs\config\applicationhost.config
在此處添加了解決方案,但相同的主體也可用於真正的 IIS。編輯
\.vs\config\applicationhost.config
.serverRuntime
從這樣切換Deny
到:Allow
<section name="serverRuntime" overrideModeDefault="Allow" />
然後
Web.config
使用以下值進行編輯:<system.webServer> <serverRuntime uploadReadAheadSize="10485760" /> ...