Ssl

IIS 在上傳大文件和使用 TLS 時隨機返回 413 Request Entity Too Large

  • September 9, 2021

我有一個在 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" />
...

引用自:https://serverfault.com/questions/900211