错误413请求实体过大

时间:2014-08-08 18:31:00

标签: c# wcf

我遇到了错误(413) Request Entity Too Large。我已经做了一些搜索,我只能看到maxRecievedMessageSize需要添加到绑定中,并且需要在bindingConfiguration中添加绑定。我已经在我的客户端web.config和service web.config上执行了这些步骤。

客户端

<bindings>
    <basicHttpBinding>
        <binding name="secureHttpBinding" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647">
            <readerQuotas maxDepth="2000000" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
            <security mode="Transport">
                <transport clientCredentialType="None"/>
            </security>
        </binding>
    </basicHttpBinding>
</bindings>
...
<endpoint address="https://mysite.com/WcfServices/MyService.svc"
binding="basicHttpBinding" bindingConfiguration="secureHttpBinding"
contract="MyService.IMyService" name="BasicHttpBinding_IMyService" />

WCF

<basicHttpBinding>
    <binding name="secureHttpBinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
        <readerQuotas maxDepth="2000000" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
        <security mode="Transport">
            <transport clientCredentialType="None"/>
        </security>
    </binding>
</basicHttpBinding>

我的WCF web.config中没有明确指定任何<service>标记,但是在没有明确定义标记之前我已经成功了。还有其他问题可以在这里发挥作用吗?

2 个答案:

答案 0 :(得分:0)

使用SSL / TLS时,在某些情况下,IIS可以在将整个HTTP请求传递给WCF之前对其进行缓冲。此缓冲区的默认大小仅为48k,如果超出缓冲区,IIS将返回413错误。

要解决此问题,必须通过uploadReadAheadSize设置增加缓冲区的大小。在IIS 7.5中,您可以通过IIS管理器进入此设置:

  1. 在“网站”下选择相关网站。
  2. 启动“配置编辑器”。
  3. 选择部分:system.webServer/serverRuntime,发件人:ApplicationHost.config
  4. uploadReadAheadSize设置为所需的缓冲区大小(以字节为单位)。确保它大于您可能发送的最大请求。
  5. 点击“应用”。
  6. 对于其他IIS版本,此设置可能位于不同的位置。

    获得413也可能有其他原因,但这是我遇到过的原因。当然,如果您没有在IIS中托管该服务,这显然不适用。

答案 1 :(得分:0)

您在服务配置文件中定义的basicHttpBinding未被使用,因为它未分配给端点。在WCF 4.0+中,如果您不明确指定端点,则将获得具有默认绑定的默认端点 - http的默认绑定为basicHttpBinding。但这也意味着您将获得绑定的默认值。

您可以显式添加服务端点并为其分配绑定,也可以通过省略basicHttpBinding属性来定义name默认定义。定义,如下:

<basicHttpBinding>
  <binding maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
           maxReceivedMessageSize="2147483647">
    <readerQuotas maxDepth="2000000" maxStringContentLength="2147483647"
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647"
                  maxNameTableCharCount="2147483647"/>
    <security mode="Transport">
      <transport clientCredentialType="None"/>
    </security>
  </binding>
</basicHttpBinding>

然后,上面的配置代码段会将basicHttpBinding的定义设置为该应用中使用basicHttpBinding的任何服务的默认设置。