WCF Consumption with Delphi - Line Length Line Length Error (8192)

I have a WCF that is used by a Delphi application. Sometimes I get this error when sending a large request to the server:

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

I configured web.config on the server side as shown below:


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> 

But I get this error all the time. Some people on the Internet suggest that client.app.config should also be changed, but I don’t know how to do this, since I use Delphi.

I also noticed that I have no idea how to set up the <endpoint> tag correctly, and maybe this is the cause of all my problems. Bellow is both an interface and a class of my web service (reduced to be more understandable):


Interface:

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

Class

 public class RoboConsultaLog : IRoboConsultaLog { ... } 

Does anyone know how to fix this?

+4
source share
1 answer

As you noticed, this is due to the configuration of the endpoint:

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

Basically, your reader’s quota configuration has not been used.

The binding parameter determines the type of binding if you want to pass the binding configuration. You will need to populate the BindingConfiguration parameter. It is quite by accident that the type of binding matches the configuration name in your case ("basicHttpBinding"). So try this (I changed the name for clarity):

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

and

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

EDIT: Also, if you are sending so much data, it might be better to send it as a file, save it in a session, and then use it in the WCF method. Data will be sent without WCF overhead, and calling WCF will be much faster, making the application more responsive. Nor will he be so prone to WCF expectations.

+3
source

All Articles