WCF:读取XML数据时已超出最大数组长度配额(16384)

时间:2022-06-13 17:27:19

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.

我正在尝试通过Web服务提交一些表单内容(也可能包含附件),但是当我尝试附加除小文件之外的任何内容时,仍然会收到以下错误。

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.

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:scChildForm时出错。 InnerException消息是'反序列化MashForms.Models.SCChildrenForm类型的对象时出错。读取XML数据时已超出最大数组长度配额(16384)。通过更改创建XML阅读器时使用的XmlDictionaryReaderQuotas对象上的MaxArrayLength属性,可以增加此配额。第1行,第41713位。'。有关更多详细信息,请参阅InnerException。

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客户端的web.config中覆盖该值,它仍然会报告为最大错误和随后的错误。

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.

我的WCF服务将接受非常小的文件,但不是更大,甚至不是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:

另外需要注意的是,当我最初将服务引用添加到WebClient时,它不会默认为较大的值,它会像这样创建:

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.

但我仍然有同样的错误。

3 个解决方案

#1


2  

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.

我已经设法通过下去customBinding路线来处理更大的文件。

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

#2


1  

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

它只是一个使用wsHttpBinding的访客。您可以在web.config中编写以下代码

<wsHttpBinding>
      <binding name="MyBinding" maxReceivedMessageSize="2147483647" />
</wsHttpBinding>

#3


0  

You've defined a "BasicHttpBinding_IInsertNewForm" binding, but are you actually hooking up this binding to your service? Do you do this in code? If so, please post the code. Because I don't see it in your config... Normally, you would have a <services> section inside the <system.servicemodel> section where the binding is actually hooked up to your service.

您已经定义了“BasicHttpBinding_IInsertNewForm”绑定,但实际上是否正在将此绑定与您的服务挂钩?你在代码中这样做了吗?如果是,请发布代码。因为我没有在你的配置中看到它...通常,你会在 部分中有一个 部分,其中绑定实际上连接到你的服务。

#1


2  

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.

我已经设法通过下去customBinding路线来处理更大的文件。

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

#2


1  

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

它只是一个使用wsHttpBinding的访客。您可以在web.config中编写以下代码

<wsHttpBinding>
      <binding name="MyBinding" maxReceivedMessageSize="2147483647" />
</wsHttpBinding>

#3


0  

You've defined a "BasicHttpBinding_IInsertNewForm" binding, but are you actually hooking up this binding to your service? Do you do this in code? If so, please post the code. Because I don't see it in your config... Normally, you would have a <services> section inside the <system.servicemodel> section where the binding is actually hooked up to your service.

您已经定义了“BasicHttpBinding_IInsertNewForm”绑定,但实际上是否正在将此绑定与您的服务挂钩?你在代码中这样做了吗?如果是,请发布代码。因为我没有在你的配置中看到它...通常,你会在 部分中有一个 部分,其中绑定实际上连接到你的服务。