WCF异常:已超出传入邮件的最大邮件大小配额(65536)

时间:2012-02-23 10:07:34

标签: c# asp.net wcf service

当我调用WCF服务时,我得到一个例外:

  

已超出传入邮件的最大邮件大小限额(65536)。要增加配额,请在相应的绑定元素上使用MaxReceivedMessageSize属性。

当我在http上使用Wireshark数据包分析器过滤器时,发送的大数据包为1226字节,其方式低于65536字节的限制。有关抛出此异常的原因的任何建议吗?Screendump from wireshark

Protocole - 长度 - 信息

服务器堆栈跟踪:

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>

我怀疑的代码会导致异常:

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

Calculate方法包含servicecall。

1 个答案:

答案 0 :(得分:1)

增加maxStringContentLength&amp;服务器和客户端上的maxArrayLength =“2147483647”。请查看以下详细说明的链接

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