Erreur WCF "Le nombre maximal d'éléments qui peuvent être sérialisés ou désérialisés dans un graphique d'objet est '65536'"
Je reçois le message d'erreur suivant sur un WCF appel:
Nombre Maximum d'éléments que vous pouvez sérialiser ou désérialiser dans un
objet graphique est "65536'
J'ai lu une tonne de posts sur le forum et beaucoup d'entre eux mentionnent la modification de l'application.config et web.config pour spécifier nouveau comportement pour permettre de plus grands graphes d'objets. Je l'ai fait et c'est ce que j'ai dans ces fichiers:
App.Config sur le projet 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 sur le projet de service:
<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>
Ceci, cependant, n'a pas aidé. Notez que les services mentionnés dans l'APPLICATION.CONFIG ne sont pas les services que je vais avoir des problèmes avec.
J'ai aussi essayé le suivant:
- ajouté ces attributs à la mise en œuvre des services: [DataContract ('IsReference=true)], [ServiceBehavior(AddressFilterMode = AddressFilterMode.Tout, MaxItemsInObjectGraph = 2147483646)]
- a écrit une coutume DataContractSerializerOperationBehavior classe que jeu de MaximumObjectsInGraph et ' IsReference comportement. Également ajouté l'Attribut personnalisé pour appliquer ce les implémentations de services. Pour des raisons d'encombrement, je n'ai pas poster le code, mais pouvez l'ajouter si quelqu'un pense qu'il serait bénéfique.
Pensées? Des idées? Où dois-je aller d'ici?
Merci d'avance!
source d'informationauteur Scot
Vous devez vous connecter pour publier un commentaire.
Je viens de réaliser que votre WPF fichier de config n'est pas bonne. Donc, j'ai supprimé tous mes commentaires, car ils ont été en supposant un valide configuration WCF. Votre WPF fichier de config n'est pas juste ... il a besoin de dire "Client" au lieu de service ... Êtes-vous en utilisant "Ajouter une Référence de Service" dans Visual Studio? si oui, il doit avoir créé le bon fichier de config pour vous.
Autrement, veuillez vous référer à MSDN pour le format correct pour votre fichier de config du client dans votre projet WPF.
Configurer les valeurs ci-dessous résolu le problème pour moi.
De La Configuration Du Client:
Server Config:
Avez-vous essayé de monter la mémoire tampon et max a reçu la taille du message?
Méfiez-vous de la "dataContractSerializer.
Dans mon cas, j'ai eu l'erreur mentionnée jusqu'à ce que j'ai mis cet élément comme le premier élément de l'élément parent "comportement".
Au moins sur le côté client, en effet.
Vous êtes de retour d'une liste générique ou un tableau qui a une taille de plus de 65 536. dans vos requêtes, à l'aide d'un select top 60000 ou non l'ajout de plus de 60k éléments permettra de résoudre votre problème.