WCF最大读取深度异常

Bur*_*urt 11 wcf web-services

尝试通过WCF服务传递DTO时,我收到以下异常.

System.Xml.XmlException: The maximum read depth (32) has been exceeded because XML data being read has more levels of nesting than is allowed by the quota. This quota may be increased by changing the MaxDepth property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 1, position 5230.
   at System.Xml.XmlExceptionHelper.ThrowXmlException
Run Code Online (Sandbox Code Playgroud)

app.config绑定看起来像这样

    <binding name="WSHttpBinding_IProjectWcfService" closeTimeout="00:10:00"
      openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="524288" maxReceivedMessageSize="10240000" messageEncoding="Text"
      textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="200" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="Message">

        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="">
          <extendedProtectionPolicy policyEnforcement="Never" />
        </transport>
        <message clientCredentialType="UserName" negotiateServiceCredential="true"
          algorithmSuite="Default" establishSecurityContext="true" />
      </security>
    </binding>
Run Code Online (Sandbox Code Playgroud)

Web.config服务行为:

    <behavior name="BehaviorConfiguration" >
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <dataContractSerializer maxItemsInObjectGraph="6553600" />
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider" />
      <serviceCredentials>
        <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" />

        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="SqlMembershipProvider"/>
      </serviceCredentials>
    </behavior>
Run Code Online (Sandbox Code Playgroud)

而DTO看起来像这样:

[Serializable]
[DataContract(IsReference=true)]
public class MyDto
{
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,因为我用它拉出我的头发.

mar*_*c_s 21

有一个叫做设置maxDepth<readerQuotas>,你应该能够设置为32(默认值)更高的价值.你显然已经在客户端设置了这个(到maxDepth = 200),但你也需要在服务器端这样做 - 否则,两个值中较小的一个(在客户端和服务器之间)将定义使用的实数.

确保您的服务器端在其wsHttpBinding配置中还包含以下行:

<readerQuotas maxDepth="200" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
Run Code Online (Sandbox Code Playgroud)


Joe*_*nez 5

您必须更改客户端和服务器上的绑定配置以匹配...