上传大文件并使用 TLS 时,IIS 随机返回 413 请求实体太大

上传大文件并使用 TLS 时,IIS 随机返回 413 请求实体太大

我在 IIS 上运行了一个 ISAPI 应用程序,该应用程序旨在支持上传任意大小的文件。在一台服务器上,413 Request Entity Too Large使用 HTTPS 时上传似乎会随机失败或超时,唯一的补救措施似乎是将其设置uploadReadAheadSize为大于上传文件的值。但是,这会将上传文件的大小限制为 2GB(最大值uploadReadAheadSize),这是不可接受的。

  • Windows Server 2012(及相应的 IIS 版本)
  • 服务器不需要客户端证书(但客户很可能 - 并且意外地 - 发送了它们?!)
  • uploadReadAheadSize在安装了相同应用程序并将其设置为默认值(49152 字节)的任何其他服务器(有很多)上均不会发生此问题。
  • 该错误由 IIS 返回,不涉及 WAF 或类似的中间组件。
  • 从任何主机发送时都会发生错误,包括从服务器主机本身发送。
  • 使用浏览器客户端以及胖客户端(原生 Windows 应用程序)上传时会出现错误。
  • 缩短请求主体实际上确实可以防止错误的发生。
  • 相同的请求可能失败或成功(例如,使用 Fiddler 重放时)

可能是什么原因导致的这种情况?我应该如何调试它?

(注意:我在 StackOverflow 和这里看到过几个类似的问题,但在这些场景中,要么需要使用客户端证书,要么应用程序基于 WCF(而我们的不是),或者问题与uploadReadAheadSizeTLS 并不独立)

另外,有什么好的资料可以了解uploadReadAheadSize实际做了什么以及“幕后”发生了什么?微软的官方文档相当稀少。

答案1

在安装 Visual Studio 2017 的 IIS Express 上出现了类似的错误,事实确实如此uploadReadAheadSize

错误:

HTTP 错误 413.0 - 请求实体太大

由于请求实体太大,页面未显示。

最可能的原因:

  • 由于请求实体太大,Web 服务器拒绝提供该请求。

  • Web 服务器无法为该请求提供服务,因为它正在尝试协商客户端证书,但是请求实体太大。

  • 请求的 URL 或到 URL 的物理映射(即到 URL 内容的物理文件系统路径)太长。

您可以尝试以下操作:

  • 验证请求是否有效。

  • 如果使用客户端证书,请尝试:

    • 增加 system.webServer/serverRuntime@uploadReadAheadSize

    • 配置您的 SSL 端点以协商客户端证书作为初始 SSL 握手的一部分。(netsh http add sslcert ... clientcertnegotiation=enable).vs\config\applicationhost.config

此处添加了解决方案,但同样的原理也可用于真正的 IIS。编辑\.vs\config\applicationhost.configserverRuntime从切换DenyAllow如下:

<section name="serverRuntime" overrideModeDefault="Allow" />

然后Web.config使用以下值进行编辑:

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...

相关内容