2013-04-28 156 views
20

我的设置:在IIS快递 WCF错误 - 最大邮件大小配额传入消息(65536)已超过

  • WCF服务托管

    • ASP.NET客户端控制台应用程序托管
    • 运行Visual Studio.NET 2012在管理模式

    我想从WCF服务返回2个List对象。当我仅返回1个List对象时,我的设置WORKS FINE。但是,当我返回2列表对象时,出现错误:

    传入消息的最大消息大小配额(65536)已被超出。要增加配额,请在适当的绑定元素上使用MaxReceivedMessageSize属性。

    我知道这个问题已经在这个网站和其他网站上被询问了很多次。我已经尝试几乎所有发布在互联网上的配置文件的各种组合,但仍然没有为我工作。

    客户端配置:

    <configuration> 
        <system.web> 
         <compilation debug="true" targetFramework="4.0" /> 
         <httpRuntime maxRequestLength="1572864"/> 
        </system.web> 
    
        <system.serviceModel> 
         <client> 
          <endpoint name="basicHttpBinding" 
           address="http://localhost:9502/HCDataService" 
           binding="basicHttpBinding" 
           bindingConfiguration="basicHttpBinding"     
           contract="HC.APP.Common.ServiceContract.IHCServiceContract" 
           behaviorConfiguration="ServiceBehaviour"> 
          </endpoint> 
         </client> 
    
         <bindings> 
          <basicHttpBinding> 
           <binding name="basicHttpBinding" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"> 
            <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="2147483646" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
           </binding> 
          </basicHttpBinding> 
         </bindings> 
    
         <behaviors> 
          <endpointBehaviors> 
           <behavior name="ServiceBehaviour"> 
            <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
           </behavior> 
          </endpointBehaviors> 
         </behaviors> 
        </system.serviceModel> 
    </configuration> 
    

    服务器配置:

    <configuration> 
        <system.serviceModel> 
         <services> 
          <service name="HC.APP.Server.Service.HCDataService" behaviorConfiguration="ServiceBehaviour"> 
           <host> 
            <baseAddresses> 
             <add baseAddress="http://localhost:9502/HCDataService"/> 
            </baseAddresses> 
           </host> 
    
           <endpoint name="basicHttpBinding" 
            address="http://localhost:9502/HCDataService" 
            binding="basicHttpBinding" 
            bindingConfiguration="basicHttpBinding" 
            contract="HC.APP.Common.ServiceContract.IHCServiceContract"> 
           </endpoint> 
          </service> 
         </services> 
    
         <bindings> 
          <basicHttpBinding> 
           <binding name="basicHttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="01:50:00" openTimeout="01:50:00" sendTimeout="01:50:00" receiveTimeout="01:50:00" > 
            <readerQuotas maxDepth="128" maxStringContentLength="8388608" maxArrayLength="2147483646" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
           </binding> 
          </basicHttpBinding> 
         </bindings> 
    
         <behaviors> 
          <serviceBehaviors> 
           <behavior name="ServiceBehaviour"> 
            <serviceDebug includeExceptionDetailInFaults="true" /> 
            <serviceMetadata httpGetEnabled="true" /> 
            <dataContractSerializer ignoreExtensionDataObject="false" maxItemsInObjectGraph="2147483646" /> 
           </behavior> 
          </serviceBehaviors> 
         </behaviors>  
        </system.serviceModel> 
    </configuration> 
    
  • +0

    我已经更新了Trickery为其他成员提供的配置文件。这现在是一个工作解决方案。我所做的更多的更改是两个配置上的maxArrayLength =“2147483646”。是的,端点的命名可以改进。 – 2013-04-28 19:39:24

    +2

    伙计们,我知道这是一个重复的问题,并在我的文章中提到了这一点。我不得不发布这个问题的原因(也可能是为什么存在相同问题的很多变体),因为WCF配置被压缩,并且很容易错过一个MINOR DETAIL。我在本网站以及其他网站上发布了很多帖子,但无法指出问题所在。它需要一些外部干预来解决问题。所以从技术上讲,我的帖子可能听起来有重复,但它在Trickery指出的小改变中有所不同。 – 2013-04-29 10:57:55

    回答

    33

    那将是因为你没有它结合使用服务器上指定。我们来看看您的服务器配置:

    根据<bindings>您正在创建<basicHttpBinding>的绑定配置,并且您将其命名为name="basicHttpBinding"。另外,您的端点名称为<endpoint name="basicHttpBinding" ...>,其绑定为binding="basicHttpBinding"但是,它不是指您的绑定配置,而是指绑定类型。所以,它实际上使用basicHttpBinding的默认设置。

    要解决这个问题,首先要以不同的方式命名您的端点和绑定配置。例如,<endpoint name="basicEndpoint" ... ><binding name="myBasicBinding" ... >。然后,您需要使用此属性将您的绑定配置分配给您的端点:bindingConfiguration="myBasicBinding"

    这里的客户端配置:

    <system.web> 
        <httpRuntime maxRequestLength="32768"/> 
    </system.web> 
    
    <system.serviceModel> 
        <client> 
         <endpoint name="basicEndpoint" 
          address="http://localhost:9502/HCDataService" 
          binding="basicHttpBinding" 
          bindingConfiguration="myBasicBinding" 
          contract="HC.APP.Common.ServiceContract.IHCServiceContract" 
          behaviorConfiguration="ServiceBehaviour"> 
         </endpoint> 
        </client> 
    
        <bindings> 
         <basicHttpBinding> 
          <binding name="myBasicBinding" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"> 
           <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
          </binding> 
         </basicHttpBinding> 
        </bindings> 
    
        <behaviors> 
         <endpointBehaviors> 
          <behavior name="ServiceBehaviour"> 
           <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
          </behavior> 
         </endpointBehaviors> 
        </behaviors>  
    </system.serviceModel> 
    

    这里的服务器配置:

    <system.serviceModel> 
        <services> 
         <service name="HC.APP.Server.Service.HCDataService" behaviorConfiguration="ServiceBehaviour"> 
          <host> 
           <baseAddresses> 
            <add baseAddress="http://localhost:9502/HCDataService"/> 
           </baseAddresses> 
          </host> 
    
          <endpoint name="basicEndpoint" 
           address="http://localhost:9502/HCDataService" 
           binding="basicHttpBinding" 
           bindingConfiguration="myBasicBinding" 
           contract="HC.APP.Common.ServiceContract.IHCServiceContract"> 
          </endpoint> 
         </service> 
        </services> 
    
        <bindings> 
         <basicHttpBinding> 
          <binding name="myBasicBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="01:50:00" openTimeout="01:50:00" sendTimeout="01:50:00" receiveTimeout="01:50:00" > 
           <readerQuotas maxDepth="128" maxStringContentLength="8388608" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
          </binding> 
         </basicHttpBinding> 
        </bindings> 
    
        <behaviors> 
         <serviceBehaviors> 
          <behavior name="ServiceBehaviour"> 
           <serviceDebug includeExceptionDetailInFaults="true" /> 
           <serviceMetadata httpGetEnabled="true" /> 
           <dataContractSerializer ignoreExtensionDataObject="false" maxItemsInObjectGraph="2147483646" /> 
          </behavior> 
         </serviceBehaviors> 
        </behaviors> 
    </system.serviceModel> 
    

    不要忘记update service reference您的客户端上,以得到正确的配置。

    +0

    有两件事:首先,OP需要将此应用于他的**客户** congif,而不是服务配置。他们在尝试从服务中接收*而不是发送时遇到此问题。其次,他们确实为绑定设置了名称,他们只是没有明确地将其设置在端点上,正如您所指出的那样。 – Tim 2013-04-28 18:55:55

    +0

    呃,不。问题是这里的服务器。客户端配置只是在添加服务引用时反映服务器的配置。其次,我从来没有说过OP没有说出这些东西,只是他以一种令人困惑的方式对它进行了命名,可能他为什么首先犯了错误,正如我在第2段中所述。 – Artless 2013-04-28 18:59:08

    +0

    关于命名问题(I当我第一次看到你的答案时错过了),我同意。但是,这**是一个客户端问题。在这种情况下,maxReceivedMessageSize适用于客户端。服务端的配额设置与客户端的配额设置完全无关。通常情况下,双方保持一致会更简单,但仅仅是因为服务可以接受。说一个1GB的文件并不意味着客户端可以 - 除非它的配额足够大。 – Tim 2013-04-28 19:07:37

    相关问题