Exception: The maximum number of elements that can be serialized or deserialized in the object graph is "65536"

I looked at other posts, but I could not find a solution to my problem.

My service configuration file:

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

My client configuration file:

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

Why am I still getting the exception:

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

It seems to ignore <dataContractSerializer maxItemsInObjectGraph="2147483647"/> in both App.config files. Why?

+8
c # serialization visual-studio-2010 wcf datacontractserializer
source share
3 answers

I solved this problem by adding behavior to C # code.

 client.Endpoint.Behaviors.Remove(typeof(CallbackBehaviorAttribute)); client.Endpoint.Behaviors.Add(new CallbackBehaviorAttribute() { MaxItemsInObjectGraph = 2147483647 }); 

The problem is probably caused by using the ServiceClient constructor with InstanceContext , Binding and EndpointAddress , so the behavior from app.config ignored.

+1
source share

On the client, see 3 lines marked **** :

  <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> 
+15
source share

Add to configuration

 <behaviors> <endpointBehaviors> <behavior name="Behaviors.EndpointBehavior"> <dataContractSerializer maxItemsInObjectGraph="2147483647" /> </behavior> </endpointBehaviors> </behaviors 

Then identify your customer behavior

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

Or do it in code

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

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

I think you also need to decorate the server-side definition and client endpoint.

+5
source share

All Articles