2012-02-23 59 views
9

cuando llame a un servicio WCF me sale una excepción:WCF Excepción: La cuota de tamaño máximo de mensaje para los mensajes entrantes (65536) se ha superado

La cuota de tamaño máximo de mensaje para los mensajes entrantes (65536) ha sido excedido. Para aumentar la cuota, use la propiedad MaxReceivedMessageSize en el elemento de enlace apropiado.

Cuando uso Wireshark filtro analizador de paquetes en el paquete http larges enviado es 1226 bytes, wich está por debajo manera el límite de 65536 bytes. ¿Alguna sugerencia de por qué se lanza esta excepción? Screendump from wireshark

Protocole-Longitud-Info

Servidor de seguimiento de la pila:

at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) 
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) 
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
... 
    <binding 
     name="WSHttpBinding_IService" 
     closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     bypassProxyOnLocal="false" 
     transactionFlow="false" 
     hostNameComparisonMode="StrongWildcard" 
     maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
     allowCookies="false"> 
     <readerQuotas 
      maxDepth="32" 
      maxStringContentLength="8192" 
      maxArrayLength="16384" 
      maxBytesPerRead="4096" 
      maxNameTableCharCount="16384" /> 
     <reliableSession 
      ordered="true" 
      inactivityTimeout="00:10:00" 
      enabled="false" /> 
     <security 
      mode="Message"> 
      <transport 
      clientCredentialType="Windows" 
      proxyCredentialType="None" 
      realm="" /> 
     <message 
      clientCredentialType="Certificate" 
      negotiateServiceCredential="true" 
      algorithmSuite="Default" /> 
     </security> 
    </binding> 

Código sospecho que provoca la excepción:

public LoanPlan CalculateLoanPlans(string productName) 
    { 
     var loanPlan = new LoanPlan 
          { 
           Details = new[] 
              { 
               new PlanDetails {LoanAmount = 5000, Periods = 6}, 
               new PlanDetails {LoanAmount = 5000, Periods = 12}, 
               new PlanDetails {LoanAmount = 5000, Periods = 24}, 

               new PlanDetails {LoanAmount = 10000, Periods = 6}, 
               new PlanDetails {LoanAmount = 10000, Periods = 12}, 
               new PlanDetails {LoanAmount = 10000, Periods = 24}, 

               new PlanDetails {LoanAmount = 15000, Periods = 6}, 
               new PlanDetails {LoanAmount = 15000, Periods = 12}, 
               new PlanDetails {LoanAmount = 15000, Periods = 24}, 

               new PlanDetails {LoanAmount = 20000, Periods = 6}, 
               new PlanDetails {LoanAmount = 20000, Periods = 12}, 
               new PlanDetails {LoanAmount = 20000, Periods = 24}, 

               new PlanDetails {LoanAmount = 30000, Periods = 6}, 
               new PlanDetails {LoanAmount = 30000, Periods = 12}, 
               new PlanDetails {LoanAmount = 30000, Periods = 24}, 

               new PlanDetails {LoanAmount = 40000, Periods = 6}, 
               new PlanDetails {LoanAmount = 40000, Periods = 12}, 
               new PlanDetails {LoanAmount = 40000, Periods = 24}, 

               new PlanDetails {LoanAmount = 50000, Periods = 6}, 
               new PlanDetails {LoanAmount = 50000, Periods = 12}, 
               new PlanDetails {LoanAmount = 50000, Periods = 24} 
              }, 
           TaxProcent = _taxPercent, 
          }; 
     Parallel.ForEach(loanPlan.Details, detail => 
               { 
                var result = Calculate(productName, Convert.ToInt32(detail.LoanAmount), detail.Periods, null); 

                detail.ActualPaymentCost = result.ActualPaymentCost; 
                detail.CreditCost = result.CreditAmount; 
                detail.MonthlyPayment = result.MonthlyPayment; 
                detail.MonthlyPaymentCost = result.MonthlyPaymentCredit; 
               }); 

     var firstDetail = loanPlan.Details[0]; 
     var firstResult = Calculate(productName, Convert.ToInt32(firstDetail.LoanAmount), firstDetail.Periods, null); 

     loanPlan.MonthlyFee = firstResult.MonthlyFee; 
     loanPlan.MonthlyInterest = firstResult.MonthlyInterest; 

     return loanPlan; 
    } 

El método Calcular contiene el ServiceCall.

+1

Se puede publicar sus entradas de configuración? – Rajesh

+1

También establezca las siguientes readerQuotas dentro de su elemento de enlace en su configuración tanto en el cliente como en el servidor: y el serializador de contrato de datos en su elemento de configuración de comportamiento: y establece maxRecievedMessageSize como se muestra: Rajesh

+0

¿No proviene el error de la respuesta del servidor en lugar de ¿tu petición? – adrianm

Respuesta

1

Aumenta maxStringContentLength & maxArrayLength = "2147483647" en el servidor y el cliente. Compruebe el enlace de más abajo que explica en detalle

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/f570823a-8581-45ba-8b0b-ab0c7d7fcae1

+0

Creo que la pregunta no es cómo solucionarlo, sino por qué sucede –

+2

Y esta es una solución muy temperamental, en el mejor de los casos. –

+0

Lo he hecho en el cliente. Quiero asegurarme de que este es el problema antes de hacer que la gente del lado del servidor cambie la configuración. Lo extraño es que no puedo ver ningún paquete más grande que el límite que se envía cuando uso wireshark. – espvar

Cuestiones relacionadas