WCF错误“对象图中可以序列化或反序列化的项的最大数目是'65536'”

我在WCF调用中收到以下错误:

在对象图中可以序列化或反序列化的项目的最大数目是'65536'

我已经阅读了大量的论坛post,其中许多人提到修改app.config和web.config来指定新的行为,以允许更大的对象图。 我已经这样做了,这是我在这些文件中的:

WPF项目上的App.Config:

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

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

但是,这并没有帮助。 请注意,APP.CONFIG中引用的服务不是我遇到的问题。

我也尝试了以下内容:

  • 将这些属性添加到服务实现中:[DataContract(IsReference = true)],[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any,MaxItemsInObjectGraph = 2147483646)]

  • 写了一个自定义DataContractSerializerOperationBehavior类,它设置了MaximumObjectsInGraph和IsReference行为。 还添加了自定义属性来应用这个服务实现。 为了混乱,我没有发布代码,但可以添加它,如果有人认为这将是有益的。

思考? 想法? 我从哪里出发?

提前致谢!

我只是意识到你的WPFconfiguration文件是不正确的。 所以,我删除了我的所有评论,因为他们假设一个有效的WCFconfiguration。 你的WPFconfiguration文件是不正确的…它需要说“客户端”而不是服务…你是否使用Visual Studio中的“添加服务引用”? 如果是这样,它应该已经为你创build了正确的configuration文件。

否则,请参阅MSDN在您的WPF项目中为您的客户端configuration文件的正确格式。

configuration下面的值解决了我的问题。

客户端configuration:

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

服务器configuration:

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

你有没有尝试加大缓冲区和最大收到邮件大小?

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

当心“dataContractSerializer”元素。 在我的情况下,我得到了错误提到,直到我把这个元素作为父元素“行为”的第一项。 至less在客户端确实如此。

您正在返回一个通用列表或一个大小超过65536的数组。在您的查询中,使用select top 60000或者不添加超过60k个元素将解决您的问题。