例外:对象图中可以序列化或反序列化的最大项数为'65536'

Sai*_*int 7 c# wcf serialization visual-studio-2010 datacontractserializer

我查看了其他帖子,但我找不到解决问题的方法.

我的服务配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>
  <appSettings>
    ...
  </appSettings>
  <log4net>
    ...
  </log4net>
  <system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="wsDualHttpBinding"/>
    </protocolMapping>
    <services>
      <service name="Service1" behaviorConfiguration="Service1Behavior">
        <endpoint address="" binding="netTcpBinding" contract="IService1" bindingConfiguration="NetTcpBinding_IService1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="/mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
      </service>
      <service name="Service2" behaviorConfiguration="Service2Behavior">
        <endpoint address="" binding="wsHttpBinding" contract="IService2" bindingConfiguration="WSHttpBinding_IService2">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_IService2" receiveTimeout="00:00:10"
          sendTimeout="00:00:10" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
          useDefaultWebProxy="false">
          <reliableSession ordered="true" inactivityTimeout="00:00:11" />
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="None" />
        </binding>
      </wsHttpBinding>
      <netTcpBinding>
        <binding name="NetTcpBinding_IService1" receiveTimeout="00:00:20"
          sendTimeout="00:00:20" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession ordered="true" inactivityTimeout="00:00:11" />
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Service1Behavior">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceMetadata httpGetEnabled="False"/>

          <serviceDebug includeExceptionDetailInFaults="True"/>
          <serviceThrottling maxConcurrentCalls="100"
                    maxConcurrentInstances="100"
                    maxConcurrentSessions="100" />
        </behavior>
        <behavior name="Service2Behavior">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True"/>
          <serviceThrottling maxConcurrentCalls="100"
                    maxConcurrentInstances="100"
                    maxConcurrentSessions="100"  />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <connectionStrings>
    ...
  </connectionStrings>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Error,ActivityTracing"
        propagateActivity="true">
        <listeners>
          ...
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我的客户端配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        ...
    </configSections>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IService1" closeTimeout="00:00:15"
                    openTimeout="00:00:15" receiveTimeout="00:00:40" sendTimeout="00:00:40"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
                    maxConnections="10" maxReceivedMessageSize="2147483647">
                    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="None">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IService2" closeTimeout="00:00:15"
                    openTimeout="00:00:15" receiveTimeout="00:00:25" sendTimeout="00:00:15"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false">
                    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                    <reliableSession ordered="true" inactivityTimeout="00:00:11" />
                    <security mode="None">
                        <transport realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://.../Design_Time_Addresses/Service2/"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService2"
                contract="Service2Reference.IService2"
                name="WSHttpBinding_IService2"  behaviorConfiguration="serviceBehaviorConfiguration">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="net.tcp://.../Design_Time_Addresses/Service1/"
                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService1"
                contract="Service1Reference.IService1" name="NetTcpBinding_IService1"
                behaviorConfiguration="serviceBehaviorConfiguration">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
      <behaviors>
        <endpointBehaviors>
          <behavior name="serviceBehaviorConfiguration">
            <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          </behavior>
        </endpointBehaviors>
      </behaviors>
    </system.serviceModel>
    <userSettings>
        ...
    </userSettings>

</configuration>
Run Code Online (Sandbox Code Playgroud)

为什么我仍然得到例外:

The formatter threw an exception while trying to deserialize the message: 
There was an error while trying to deserialize parameter http://tempuri.org/:GetData.
The InnerException message was 'Maximum number of items that can be serialized or deserialized in an object graph is '65536'. 
Change the object graph or increase the MaxItemsInObjectGraph quota. '.
Run Code Online (Sandbox Code Playgroud)

似乎<dataContractSerializer maxItemsInObjectGraph="2147483647"/>在两个App.config文件中都忽略了.为什么?

Mar*_*ell 15

在客户端,请参阅标记为3行****:

    <client>
        <endpoint address="http://.../Design_Time_Addresses/Service2/"
****        behaviorConfiguration="foo"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService2"
            contract="Service2Reference.IService2"
            name="WSHttpBinding_IService2">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
        <endpoint address="net.tcp://.../Design_Time_Addresses/Service1/"
****        behaviorConfiguration="foo"
            binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService1"
            contract="Service1Reference.IService1" name="NetTcpBinding_IService1">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
  <behaviors>
    <endpointBehaviors>
****  <behavior name="foo">
        <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
Run Code Online (Sandbox Code Playgroud)


小智 5

添加到配置

<behaviors> 
    <endpointBehaviors> 
        <behavior name="Behaviors.EndpointBehavior"> 
            <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
        </behavior> 
    </endpointBehaviors> 
</behaviors
Run Code Online (Sandbox Code Playgroud)

然后用行为定义您的客户端

<client> 
    <endpoint address=http://localhost:9997/Services/MyService 
        behaviorConfiguration="Behaviors.EndpointBehavior" 
        binding="wsHttpBinding" bindingConfiguration="WSHTTPBinding.Configuration.Client" 
        contract="IAppointments" name="Client.EndpointConfiguration" /> 
</client>
Run Code Online (Sandbox Code Playgroud)

或者在代码后面做

foreach ( var operation in channelFactory.Endpoint.Contract.Operations )   
{   
    var behavior = operation.Behaviors.Find() as DataContractSerializerOperationBehavior;   
    if ( behavior != null )   
    {   
        behavior.MaxItemsInObjectGraph = 2147483647;       
    }   
} 
Run Code Online (Sandbox Code Playgroud)

(来源:http://devlicio.us/blogs/derik_whittaker/archive/2010/05/04/setting-maxitemsinobjectgraph-for-wcf-there-has-to-be-a-better-way.aspx)

我认为你必须装饰服务器端定义和客户端端点.


Sai*_*int 1

我通过在 C# 代码中添加行为解决了这个问题。

client.Endpoint.Behaviors.Remove(typeof(CallbackBehaviorAttribute));
client.Endpoint.Behaviors.Add(new CallbackBehaviorAttribute() { MaxItemsInObjectGraph = 2147483647 });
Run Code Online (Sandbox Code Playgroud)

问题可能是由于ServiceClient将构造函数与 一起使用而引起的InstanceContextBinding因此EndpointAddressfrom 的行为app.config被忽略。