I have a WCF that is being consumed by a Delphi app. 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 have configured the web.config on the server side as follow:
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 keep receiving this error. Some people on Internet suggests that app.config on the client side should be modified as well, but I have no idea how to do that since I am using Delphi.
I also noticed that I have no idea how to properly configure the <endpoint> tag, and maybe that is the cause of all my troubles. Bellow are both the interface and the class of my web service (reduced to be more clear):
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 knows how to fix this?
As You noticed, it’s beacuse of endpoint configuration:
Basically Your reader quota configuration wasn’t used.
Binding parameter defines type of binding only, if You want to pass a binding configuration You’ll have to fill BindingConfiguration parameter. It’s only a coincidence that binding type is the same as configuration name in Your case(“basicHttpBinding”). So try this(I’ve changed name for clarity):
and
EDIT: Additionally, if You send so much data, maybe It would be better to send it as a file, save it in Session and then use it in WCF method. Data would be send without WCF overhead, and WCF call would be a lot quicker, making application more responsive. Also it wouldn’t be so prone to WCF timeouts.