WCF 服务返回的意外响应:(413) 请求实体太大

Unexpected response returned by WCF Service: (413) Request Entity Too Large

我已经使用 WCF 实现了一小组 REST 服务。其中一项服务接收大量数据。调用它时(这是从 visual studio 运行它时 - 我还没有将它部署到生产服务器)我得到错误

The remote server returned an error: (413) Request Entity Too Large.

我的网络配置

<binding name="BasicHttpBinding_ISalesOrderDataService" 
         closeTimeout="00:10:00"
         openTimeout="00:10:00" 
         receiveTimeout="00:10:00" 
         sendTimeout="00:10:00"
         allowCookies="false" 
         bypassProxyOnLocal="false" 
         hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" 
         maxBufferSize="2147483647" 
         maxReceivedMessageSize="2147483647"
         textEncoding="utf-8" 
         transferMode="Buffered" 
         useDefaultWebProxy="true"
         messageEncoding="Text">
  <readerQuotas maxDepth="2000000" 
                maxStringContentLength="2147483647"
                maxArrayLength="2147483647" 
                maxBytesPerRead="2147483647"
                maxNameTableCharCount="2147483647" />
  <security mode="None">
    <transport clientCredentialType="None" 
               proxyCredentialType="None" 
               realm="" />
    <message clientCredentialType="UserName" 
             algorithmSuite="Default" />
  </security>
</binding>

您似乎超出配额增加了这些值。

 maxReceivedMessageSize="2000000" maxBufferSize="2000000">

(或尽可能检查您的查询以获得较低的结果)

如果没有任何效果,请检查这里是否存在常见问题。

The remote server returned an error: (413) Request Entity Too Large

恐怕你的客户端没问题,但你需要检查一下服务器web.config

以与您为客户相同的方式增加价值

<bindings>
      <basicHttpBinding>
        <binding maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text">
          <readerQuotas maxDepth="2000000" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </basicHttpBinding>
</bindings>

除了增加消息大小和缓冲区大小引用之外,还考虑增加序列化程序的 maxItemsInObjectGraph。如果您的对象内部具有复杂的结构或对象数组,则可能很重要。 我们的典型设置看起来是这样

 <behaviors>
  <endpointBehaviors>
    <behavior name="GlobalEndpoint">
      <dataContractSerializer maxItemsInObjectGraph="1365536" />
    </behavior>
 </behaviors>
 <serviceBehaviors>
    <behavior name="GlobalBehavior">
      <dataContractSerializer maxItemsInObjectGraph="1365536" />
    </behavior>
 </serviceBehaviors>

另外还有 Zwan 提出的建议

如果我对您的理解正确的话,您的请求是传送大量数据的请求。这意味着您必须像@Zwan 所写的那样编辑 maxRecievedMessageSize。不在客户端的配置中,而是在其余服务配置中,以允许大数据请求。

如果您在 asp.net 应用程序中托管 wcf rest 服务,则还必须设置 httpRuntime 限制,因为 wcf 服务在 ASP .NET 兼容模式。请注意,maxRequestLength 的值以千字节为单位

<configuration> <system.web>
<httpRuntime maxRequestLength="10240" /> </system.web> </configuration>

参考The remote server returned an error: (413) Request Entity Too Large

更多建议应该为服务做Dispose、析构函数

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple, MaxItemsInObjectGraph = 2147483647)]
[GlobalErrorBehaviorAttribute(typeof(GlobalErrorHandler))]
public partial class YourService : IYourService
{

    // Flag: Has Dispose already been called? 
    bool disposed = false;
    // Instantiate a SafeHandle instance.
    SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);

    // Public implementation of Dispose pattern callable by consumers. 
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // Protected implementation of Dispose pattern. 
    protected virtual void Dispose(bool disposing)
    {
        if (disposed)
            return;

        if (disposing)
        {
            handle.Dispose();
            // Free any other managed objects here. 
            //
        }

        // Free any unmanaged objects here. 
        //
        disposed = true;
    }

    ~YourService()  // destructor
    {
      Dispose();
    }

}

希望对您有所帮助!

既然 maxRecievedMessageSize 没问题,你可以检查一下 "IIS Request Filtering" 其中请求内容的最大长度,以字节为单位

同样在 IIS 中 – “UploadReadAheadSize” 阻止上传和下载大于 49KB 的数据。默认值为 49152 字节,最多可增加到 4 GB。

尝试增加 web.config 文件中的 "maxItemsInObjectGraph" 大小,因为此更改对 me.For 有效,详情请参阅。