.net wcf datacontractserializer xmlserializer servicebehavior

.net - Error de WCF "El número máximo de elementos que se pueden serializar o deserializar en un gráfico de objetos es ''65536''"



datacontractserializer xmlserializer (5)

¿Has intentado subir el búfer y el tamaño máximo de mensaje recibido también?

maxBufferSize="6553600" maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600"

Recibo el siguiente error en una llamada a WCF:

El número máximo de elementos que se pueden serializar o deserializar en un gráfico de objetos es ''65536''

He leído un montón de mensajes en el foro y muchos de ellos mencionan la modificación de app.config y web.config para especificar un nuevo comportamiento para permitir gráficos de objetos más grandes. Lo hice y esto es lo que tengo en esos archivos:

App.Config en el proyecto de WPF:

<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="false" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name=""> <dataContractSerializer maxItemsInObjectGraph="2147483646"/> </behavior> </endpointBehaviors> </behaviors> <services> <service name="digiPM.Shell.LogOutPMSEMRService.PMSEMRLogOutService"> <!--<endpoint address="" binding="basicHttpBinding" contract="digiPM.Shell.LogOutPMSEMRService.IPMSEMRLogOutService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://localhost:8732/Design_Time_Addresses/digiPM.Shell.LogOutPMSEMRService/PMSEMRLogOutService/" /> </baseAddresses> </host>--> <endpoint address="" binding="netTcpBinding" name="NetTcpBindingEndpoint" contract="digiPM.Shell.LogOutPMSEMRService.IPMSEMRLogOutService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" name="MexTcpBidingEndpoint" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:8732/Design_Time_Addresses/digiPM.Shell.LogOutPMSEMRService/PMSEMRLogOutService/" /> </baseAddresses> </host> </service> </services> <!--binding info - removed this for the sake of readability for this post -->

web.config en el proyecto de servicio:

<system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_Services" closeTimeout="01:10:00" openTimeout="01:10:00" receiveTimeout="01:10:00" sendTimeout="01:10:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="4096" maxStringContentLength="2147483647" maxArrayLength="524288" maxBytesPerRead="524288" maxNameTableCharCount="524288" /> <reliableSession ordered="true" inactivityTimeout="01:10:00" enabled="false" /> <security mode="None"> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="digiPM.Service.Behavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> <dataContractSerializer maxItemsInObjectGraph="2147483647" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="customObjectQuota"> <dataContractSerializer maxItemsInObjectGraph="2147483646"/> </behavior> </endpointBehaviors> </behaviors> <services> <service behaviorConfiguration="digiPM.Service.Behavior" name="digiPM.Service.AddressCrudService"> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_Services" name="AddressCrudServiceEndPoint" bindingNamespace="urn:Dawliasoft.Sculpture" contract="digiPM.Services.Contracts.IAddressCrudService" behaviorConfiguration="customObjectQuota" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" behaviorConfiguration="customObjectQuota" /> </service> <!--<more services defined with same configuration as above..>--> </services> </system.serviceModel>

Esto, sin embargo, no ha ayudado. Tenga en cuenta que los servicios a los que se hace referencia en APP.CONFIG no son los servicios con los que estoy teniendo problemas.

También intenté lo siguiente:

  • agregó estos atributos a la implementación del servicio: [DataContract (IsReference = true)], [ServiceBehavior (AddressFilterMode = AddressFilterMode.Any, MaxItemsInObjectGraph = 2147483646)]

  • escribió una clase de DataContractSerializerOperationBehavior personalizada que establece el comportamiento MaximumObjectsInGraph y IsReference. También se agregó un atributo personalizado para aplicar esto a las implementaciones del servicio. Por el desorden, no publiqué el código, pero puedo agregarlo si alguien piensa que sería beneficioso.

¿Pensamientos? Ideas? ¿A donde voy desde aqui?

¡Gracias por adelantado!


Me acabo de dar cuenta de que su archivo de configuración WPF no es correcto. Entonces, borré todos mis comentarios porque estaban asumiendo una configuración WCF válida. Su archivo de configuración de WPF no está bien ... necesita decir "Cliente" en lugar de servicio ... ¿Está utilizando "Agregar referencia de servicio" en Visual Studio? si es así, debería haber creado el archivo de configuración correcto para usted.

De lo contrario, consulte MSDN para obtener el formato correcto para su archivo de configuración de cliente en su proyecto de WPF.


La configuración de los valores siguientes resolvió el problema para mí.

Configuración del cliente:

<system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IManagementService" 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="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="128" maxStringContentLength="2147483647" 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://XXXX/ManagementService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IManagementService" contract="ManagementServiceReference.IManagementService" name="BasicHttpBinding_IManagementService" behaviorConfiguration="ManagementServiceBehaviour"/> </client> <behaviors> <endpointBehaviors> <behavior name="ManagementServiceBehaviour"> <dataContractSerializer maxItemsInObjectGraph="2147483647"/> </behavior> </endpointBehaviors> </behaviors>

Configuración del servidor:

<system.serviceModel> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> <behaviors> <serviceBehaviors> <behavior name="ManagementServiceBehaviour"> <serviceDebug includeExceptionDetailInFaults="true" /> <serviceMetadata httpGetEnabled="true" /> <dataContractSerializer ignoreExtensionDataObject="false" maxItemsInObjectGraph="2147483646" /> </behavior> <behavior name=""> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="01:50:00" openTimeout="01:50:00" sendTimeout="01:50:00" receiveTimeout="01:50:00" > <readerQuotas maxDepth="128" maxStringContentLength="8388608" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> </binding> </basicHttpBinding> </bindings> <services> <service behaviorConfiguration="ManagementServiceBehaviour" name="BusinessLogic.Facade.EntityFacade.Services.ManagementService"> <endpoint binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="BusinessLogic.Facade.EntityFacade.Contracts.IManagementService"> <identity> <dns value="" /> </identity> </endpoint> </service> </services> </system.serviceModel>


Está devolviendo una lista genérica o una matriz que tiene un tamaño de más de 65536. En sus consultas, el uso de una selección superior de 60000 o no agregar más de 60k elementos resolverá su problema.


Tenga cuidado con el elemento "dataContractSerializer". En mi caso, recibí el error mencionado hasta que puse este elemento como el primer elemento del elemento principal "comportamiento". Al menos en el lado del cliente de hecho.