【问题标题】:Unexpected response returned by WCF Service: (413) Request Entity Too LargeWCF 服务返回的意外响应:(413) 请求实体太大
【发布时间】:2015-10-14 12:22:09
【问题描述】:

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

远程服务器返回错误:(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>

【问题讨论】:

  • 你在哪里托管?在 IIS 中?
  • 我的数据只有 20KB 。当我将对象转换为 JSON 时。
  • 在您的 service 配置中,您是否定义了相同的绑定,并且您是否将该绑定分配给显式端点?您可以发布服务配置的&lt;system.serviceModel&gt; 部分吗?
  • 在我的代码中,我动态更改端点 URL。他们会影响吗?
  • 请在下面找到动态更改端点的代码SalesOrderDataServiceClient _sodataservice = new SalesOrderDataServiceClient(); string[] EndPointURLSplitups = _sodataservice.Endpoint.Address.Uri.AbsoluteUri.Split('/'); _sodataservice.Endpoint.Address = new System.ServiceModel.EndpointAddress(new Uri(enpointurl + "/" + EndPointURLSplitups[EndPointURLSplitups.Length - 1]), _sodataservice.Endpoint.Address.Identity, _sodataservice.Endpoint.Address.Headers); _salesOrderDataService = _sodataservice;

标签: c# wcf web-config


【解决方案1】:

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

 maxReceivedMessageSize="2000000" maxBufferSize="2000000">

(或在可能的情况下查看您的查询以获得较低的结果)

如果没有任何工作,请在此处检查它就像常见的问题。

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

【讨论】:

  • 之前我使用 2000000 .. 当我看到一些与此相关的文章时更改为 2147483647
【解决方案2】:

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

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

另外还有 Zwan 提出的建议

【讨论】:

    【解决方案3】:

    恐怕您的客户端没问题,但您需要检查服务器 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>
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 如果我有声望,我会把它写成评论,不幸的是我还不允许这样做。
      【解决方案5】:

      尝试增加 web.config 文件中的 "maxItemsInObjectGraph" 大小,因为此更改对我有用。有关详细信息,请参阅。

      【讨论】:

      【解决方案6】:

      既然 maxRecievedMessageSize 没问题,你可以检查“IIS 请求过滤” 请求中内容的最大长度,以字节为单位

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

      【讨论】:

        【解决方案7】:

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

        <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();
            }
        

        }

        希望对你有帮助!

        【讨论】:

        • 服务器设置
        • 更多建议应该使 Dispose 成为服务的析构函数。看我的回答。
        猜你喜欢
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 1970-01-01
        相关资源
        最近更新 更多