使用Delphi使用WCF - 最大字符串内容长度配额(8192)错误

时间:2012-08-07 18:04:37

标签: c# wcf delphi soap web-config

我有一个正在被Delphi应用程序使用的WCF。有时在向服务器发送大量请求时会出现此错误:

---------------------------
Debugger Exception Notification
---------------------------
Project Project43.exe raised exception class ERemotableException with message 'The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'Log'. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 58, position 140.'.
---------------------------
Break   Continue   Help   
---------------------------

我在服务器端配置了web.config,如下所示:


的Web.config

<?xml version="1.0" ?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>

    <bindings>
      <basicHttpBinding>
        <binding name="basicHttpBinding">
          <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>

    <services>
      <service name="NewServiceType">
        <clear />
        <endpoint address="http://localhost" binding="basicHttpBinding" bindingConfiguration="" contract="IRoboConsultaLog" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

但我一直收到这个错误。 Internet上的一些人建议客户端的app.config也应该修改,但我不知道怎么做,因为我使用的是Delphi。

我也注意到我不知道如何正确配置<endpoint>标签,也许这就是造成我所有麻烦的原因。 Bellow是我的Web服务的界面和类(减少得更清楚):


接口:

namespace RoboConsultaLogServer
{
    [ServiceContract]
    public interface IRoboConsultaLog
    {
        [OperationContract]
        void Log(string key, string numeroSerial, string nomeTarefa, int qtdProcessos, float uptime, float duracaoTarefa,
                 int qtdSucesso, int qtdInsucesso, int qtdCancelado, bool servico, bool notificarResponsaveis, string logProcessos);
    }
}

public class RoboConsultaLog : IRoboConsultaLog 
{
    ...
}

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

正如您所注意到的,它是由端点配置引起的:

<endpoint address="http://localhost" binding="basicHttpBinding" bindingConfiguration="" contract="IRoboConsultaLog" />

基本上没有使用您的读者配额配置。

绑定参数仅定义绑定类型,如果要传递绑定配置,则必须填写BindingConfiguration参数。绑定类型与您的案例中的配置名称相同(“basicHttpBinding”)只是巧合。所以试试这个(我为了清晰起见改了名字):

    <bindings>
      <basicHttpBinding>
        <binding name="myBindingConfiguration">
          <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>

    <endpoint address="http://localhost" binding="basicHttpBinding" bindingConfiguration="myBindingConfiguration" contract="IRoboConsultaLog" />

编辑:此外,如果您发送了这么多数据,可能最好将其作为文件发送,将其保存在Session中,然后在WCF方法中使用它。数据将在没有WCF开销的情况下发送,并且WCF调用会更快,使应用程序更具响应性。此外,WCF超时也不会那么容易。

相关问题