C# – WCF Exception: The maximum message size quota for incoming messages (65536) has been exceeded

asp.netcservicewcf

When I call a WCF service I get an exception:

The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.

When I use Wireshark packet analyzer filter on http the larges packet sent is 1226 bytes, which is way bellow the limit of 65536 bytes. Any suggestions to why this exception is thrown?

Screendump from wireshark

Protocol-Length-Info

Server stack trace:

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>

Code that I suspect causes the exception:

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

The Calculate method contains the servicecall.

Best Answer

Increase maxStringContentLength & maxArrayLength="2147483647" on both server and client. Check the below link which explains in detail

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