上传大文件并使用 TLS 时,IIS 随机返回 413 Request Entity Too Large

Flo*_*ter 7 iis ssl https upload

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

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

可能是什么原因导致这个问题,我应该如何调试这个问题?

(注意:我在 StackOverflow 和此处看到了几个类似的问题,但在这些情况下,要么要使用客户端证书,要么应用程序基于 WCF(我们的不是),或者问题不独立于uploadReadAheadSize或传输层安全)

uploadReadAheadSize另外,什么是了解实际情况以及“幕后”发生的事情的良好来源?微软的官方文档相当稀疏。

Ogg*_*las 4

在使用 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.configserverRuntimeDeny这样切换Allow

<section name="serverRuntime" overrideModeDefault="Allow" />
Run Code Online (Sandbox Code Playgroud)

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

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...
Run Code Online (Sandbox Code Playgroud)