具有 30mb 输入字符串的 WCF 服务 - 远程服务器返回错误:(413)请求实体太大

Posted

技术标签:

【中文标题】具有 30mb 输入字符串的 WCF 服务 - 远程服务器返回错误:(413)请求实体太大【英文标题】:WCF service with 30mb input string - The remote server returned an error: (413) Request Entity Too Large 【发布时间】:2021-05-06 21:41:47 【问题描述】:

客户端使用太大的 xml(保存到文件时大约 30mb)调用我的 WCF 方法,并且 IIS 返回 413。我尝试将 uploadReadAheadSize 设置为 2gb;没用。还尝试将绑定的 ma​​xBufferSize 增加到 2gb。

我的 WCF 服务托管在带有几台服务器的负载均衡器上;由于证书验证到位,我无法进行隔离测试。我没有尝试的是协商客户端证书,考虑到其他服务的广大消费者,我们不想更改它。

使用 uploadReadAheadSize 的默认 48kb,我能够测试 7mb 大小的 xml 字符串并且它有效。堆栈溢出/谷歌显示uploadReadAheadSize的所有发现都应该修复它。我不确定我做错了什么。客户端可能是非 .net 客户端,我对其控制较少。

【问题讨论】:

这个问题的答案可能对你有帮助:techcommunity.microsoft.com/t5/iis-support-blog/… 【参考方案1】:

那不是 IIS 的问题,而是 WCF 的问题。默认情况下,WCF 将消息限制为 65KB,以避免使用大消息进行拒绝服务攻击。此外,如果您不使用 MTOM,它会将 byte[] 发送到 base64 编码字符串(大小增加 33%)=> 48KB * 1,33 = 64KB

要解决此问题,您必须重新配置服务以接受更大的消息。此问题之前触发了 400 Bad Request 错误,但在较新版本中,WCF 开始使用 413,这是此类错误的正确状态代码。

您需要在绑定中设置 maxReceivedMessageSize。您可能还需要设置 readerQuotas。

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="12345.......">
        <readerQuotas ... />
      </binding>
    </basicHttpBinding>
  </bindings>  
</system.serviceModel>

https://***.com/a/10123764/6459462

【讨论】:

绑定上的所有值都设置为最大值 (2gb)。还是没有成功。

以上是关于具有 30mb 输入字符串的 WCF 服务 - 远程服务器返回错误:(413)请求实体太大的主要内容,如果未能解决你的问题,请参考以下文章

通过 WCF 休息服务发送大文件 (>10 MB)

有没有一种特定的方法可以在一个输入中上传超过30张照片,而不会增加最大上传大小?

如何提高 WCF 数据服务性能

大二进制 (byte[]) 通过 WCF 传输文件

使用 WCF 创建需要身份验证并使用 JSON 作为输入/输出格式的 RESTful Web 服务

使用 WCF 中的任务构建异步操作合同的正确方法