5

我有以下问题。

我在 IIS 8 上托管了一个 WCF 应用程序,它只接受带有客户端证书的 HTTPS 请求。此服务接受大小可能不同(从几个字节到 1 GB)的 POST 消息,并且大部分时间是并行接收的。

在以下情况下,客户端会收到 413 Request entity too large 响应:

  • 当使用相同的客户端证书打开多个连接并上传许多小文件时。在这种情况下,一个请求成功,所有其他请求都失败并出现 413 错误。

该问题可以通过将该uploadReadAheadSize值设置为大于system.webServer/serverRuntime配置部分中所有并行调用大小的总和来解决,但这会导致服务器为每个调用分配预读缓冲区的全部内存量在许多并发调用的情况下导致服务器内存不足。

如果使用不同的客户端证书进行调用或上传一个大文件,则我的配置有效。

我已经读过 IIS 6 有一个选项可以SSLAlwaysNegoClientCert在配置中设置以修复类似的错误。我已经尝试过解决方法来设置此值,但使用 IIS 8.0 没有成功。我还尝试关闭 SSL 客户端缓存以禁用 SSL 会话恢复,但这也没有解决我的问题。

什么可能导致 413 错误?有没有办法在不使用服务器的整个内存的情况下启用多个并行上传与客户端证书到同一服务器。

4

1 回答 1

1

只是一个猜测:

如果请求客户端重新协商,则必须使用 SSL 预加载来预加载请求实体主体。SSL 预加载将使用 UploadReadAheadSize 元数据库属性的值,该属性用于 ISAPI 扩展。但是,如果 UploadReadAheadSize 小于内容长度,则会返回 HTTP 413 错误,并关闭连接以防止死锁。(发生死锁是因为客户端正在等待完成发送请求实体,而服务器正在等待重新协商完成,但重新协商要求客户端能够发送数据,这是它无法做到的)。

(来自文章客户端无法重新协商请求并返回 HTTP 413 错误(IIS 6.0)。)

未设置 SSLAlwaysNegoClientCert 时会发生客户端重新协商,因此请使用 OpenSSL 检查它是否已启用(请参阅此问题)。我没有使用 IIS 8,但在 IIS 7.5 上,从您链接的问题中启用 SSLAlwaysNegoClientCert 的两种方法都对我有用。

于 2014-04-07T08:24:20.250 回答