WCF: The maximum array length quota (16384) has been exceeded while reading XML data

12,360

Solution 1

Thanks for all the suggestions. Unfortunately none of the suggestions fixed the issue, it still seemed to pick up a value from somewhere which overrode it.

I have managed to get things working with larger files by going down the customBinding route.

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="MashPortalService.MyServiceBehaviour">
                <dataContractSerializer maxItemsInObjectGraph="2147483647"  />
                <serviceTimeouts transactionTimeout="05:05:00" />
                <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" maxConcurrentInstances="2147483647" />
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!--<serviceMetadata httpsGetEnabled="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" />
                <!--<StructureMapServiceBehavior />-->
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="false" />
    <extensions>
        <behaviorExtensions>
        </behaviorExtensions>
    </extensions>
    <bindings>
        <customBinding>
            <binding name="MashCustomBinding"
                    closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00">
                <textMessageEncoding messageVersion="Soap11" maxReadPoolSize="2147483647" maxWritePoolSize="2147483647">
                    <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" />
                </textMessageEncoding>
                <httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/>
            </binding>
        </customBinding>
    </bindings>
    <services>
        <service behaviorConfiguration="MashPortalService.MyServiceBehaviour" name="MashPortalService.InsertNewForm">
            <endpoint address="" binding="customBinding"
                                bindingConfiguration="MashCustomBinding" contract="MashPortalService.IInsertNewForm" />
        </service>
    </services>
</system.serviceModel>

Solution 2

It is only a guest using wsHttpBinding. You can write below code in web.config

<wsHttpBinding>
      <binding name="MyBinding" maxReceivedMessageSize="2147483647" />
</wsHttpBinding>
Share:
12,360
David C
Author by

David C

Updated on July 20, 2022

Comments

  • David C
    David C almost 2 years

    I know this has been asked quite a few times, and trust me I've been looking at and trying many of them for half the afternoon, but still cannot get past this.

    I'm trying to submit some form contents (which can also include an attachment) over a web service, but keep getting the following error when I try to attach anything other than a tiny file.

    My Full Error is:

    The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:scChildForm. The InnerException message was 'There was an error deserializing the object of type MashForms.Models.SCChildrenForm. The maximum array length quota (16384) has been exceeded while reading XML data. This quota may be increased by changing the MaxArrayLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 1, position 41713.'. Please see InnerException for more details.

    No matter how much I try to override that value in the web.config of the WCF Service and the Web Client also, it still reports that as the maximum and subsequently errors.

    WCF Web.Config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
            <!--<httpRuntime maxRequestLength="409600" executionTimeout="300" />-->
      </system.web>
      <connectionStrings>
        <add name="MashFormsContext" connectionString="Data Source=ServerName;Initial Catalog=MashFormsDev;Persist Security Info=True;User ID=UserName;Password=Password" providerName="System.Data.SqlClient" />
      </connectionStrings>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior>
                        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
                        <serviceTimeouts transactionTimeout="05:05:00" />
                        <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" maxConcurrentInstances="2147483647" />
              <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
              <serviceMetadata httpGetEnabled="true"/>
              <!--<serviceMetadata httpsGetEnabled="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" />
              <!--<StructureMapServiceBehavior />-->
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="false" />
        <extensions>
          <behaviorExtensions>
          </behaviorExtensions>
        </extensions>
    
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IInsertNewForm" closeTimeout="00:01:00"
              openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
              allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
              maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
              messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed"
              useDefaultWebProxy="true">
                        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
                maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
                        <security mode="None">
                            <transport clientCredentialType="None" proxyCredentialType="None"
                  realm="" />
                            <message clientCredentialType="UserName" algorithmSuite="Default" />
                        </security>
                    </binding>
                </basicHttpBinding>
            </bindings>
    
        </system.serviceModel>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
            <validation validateIntegratedModeConfiguration="false" />
      </system.webServer>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    My Web Client Web.Config

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      http://go.microsoft.com/fwlink/?LinkId=152368
      -->
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
      <connectionStrings>
        <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-PublicForms-20121112151426;Integrated Security=SSPI" />
      </connectionStrings>
      <appSettings>
        <add key="webpages:Version" value="2.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="PreserveLoginUrl" value="true" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      </appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <authentication mode="Forms">
          <forms loginUrl="~/Account/Login" timeout="2880" />
        </authentication>
        <pages>
          <namespaces>
            <add namespace="System.Web.Helpers" />
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Optimization" />
            <add namespace="System.Web.Routing" />
            <add namespace="System.Web.WebPages" />
          </namespaces>
        </pages>
    
        <sessionState mode="InProc" customProvider="DefaultSessionProvider">
          <providers>
            <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
          </providers>
        </sessionState>
      </system.web>
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules runAllManagedModulesForAllRequests="true" />
        <handlers>
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
      </entityFramework>
      <system.serviceModel>
    
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IInsertNewForm" closeTimeout="00:01:00"
              openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
              allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
              maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
              messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
              useDefaultWebProxy="true">
              <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
                maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
              <security mode="None">
                <transport clientCredentialType="None" proxyCredentialType="None"
                  realm="" />
                <message clientCredentialType="UserName" algorithmSuite="Default" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://localhost:54070/MashPortalService/InsertNewForm.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IInsertNewForm"
            contract="InsertNewForm.IInsertNewForm" name="BasicHttpBinding_IInsertNewForm" />
        </client>
      </system.serviceModel>
    </configuration>
    

    My WCF Service will accept very small files, but not larger, not even 28k.

    As an additional note, when I initially add the Service Reference into the WebClient, it doesn't default to the larger values, it creates it like this:

    Default Web Client Web.config

      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IInsertNewForm" closeTimeout="00:01:00"
              openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
              allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
              maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
              messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
              useDefaultWebProxy="true">
              <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
              <security mode="None">
                <transport clientCredentialType="None" proxyCredentialType="None"
                  realm="" />
                <message clientCredentialType="UserName" algorithmSuite="Default" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://localhost:54070/MashPortalService/InsertNewForm.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IInsertNewForm"
            contract="InsertNewForm.IInsertNewForm" name="BasicHttpBinding_IInsertNewForm" />
        </client>
      </system.serviceModel>
    

    Update 1: Response to Eugene

    using System.ServiceModel;
    using MashForms.Models;
    
    namespace MashPortalService
    {
        [ServiceContract]
        public interface IInsertNewForm
        {
            //Testing operations
            [OperationContract]
            string TestReturnInput(string s);
            [OperationContract]
            bool Ping();
    
            //Child
            [OperationContract]
            int InsertFormChildGettingIdBack(SCChildrenForm scChildForm);
        }
    }
    

    Update 2: Added Service Endpoint as suggested

    </bindings>
            <services>
                <service name="MashPortalService">
                    <endpoint address="http://localhost:54070/MashPortalService/InsertNewForm.svc" binding="basicHttpBinding"
                                        bindingConfiguration="BasicHttpBinding_IInsertNewForm" contract="InsertNewForm.IInsertNewForm" />
                </service>
            </services>
    

    But still I have the same error.

  • David C
    David C over 11 years
    I've added an update 1, I assume that is what you mean. Thanks for your reply. @Eugene Osovetsky Also, as I mentioned, it works for small files < 12k so I assume that bit must be ok?
  • DaddyGa
    DaddyGa over 11 years
    No, that's not what I meant... how does the service know that it's supposed to use the "BasicHttpBinding_IInsertNewForm" binding that you've defined? I don't see anything in what you've posted that does that. Try adding an appropriate &lt;services&gt; section to your config and see if it helps. See how it's done in the first answer to stackoverflow.com/questions/8382392/…
  • David C
    David C over 11 years
    Ah, like this? <services> <service name="MashPortalService"> <endpoint address="localhost:54070/MashPortalService/InsertNewForm.svc‌​" binding="wsHttpBinding" bindingConfiguration="BasicHttpBinding_IInsertNewFo‌​rm" contract="InsertNewForm.IInsertNewForm" /> </service> </services> When I try that it errors when I try to update the Reference from the Web App.
  • DaddyGa
    DaddyGa over 11 years
    Well, in your case it has to be basicHttpBinding, not wsHttpBinding
  • David C
    David C over 11 years
    Unfortunately that made no difference, it still throws an identical error.
  • David C
    David C over 11 years
    Still identical to the error at the top of this question @Kieren Johnstone