WCF : Message vide avec un trop grand nombre de données

J’ai rencontré un problème récemment concernant un service WCF qui ne renvoyait une réponse vide (confirmée par SOAP UI) dans le cas d’un trop grand nombre de donnée. La taille des messages étaient à leur valeur maximale et les messages n’atteignaient pas cette limite. Notre service renvoyait bien des données si on limitait le nombre et cela ne renvoyait plus rien à partir d’une certaine limite.

Afin de résoudre ce problème nous avons activé les traces en plaçant la configuration suivante dans le fichier de configuration de notre service WCF (dans notre cas notre web.config)

	
<system.diagnostics>
	<sources>
		<source name="System.ServiceModel" switchValue="All" propagateActivity="true">
			<listeners>
				<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\logs\server.webservicelayer_Traces.svclog"/>
			</listeners>
		</source>
	</sources>
</system.diagnostics>

Cela permet de logger les appels à notre service dans un fichier svclog consultable via l’outil Microsoft Trace Service Viewer.

Nous avons alors pu voir que l’erreur était :

System.Runtime.Serialization.SerializationException

Une erreur s’est produite en tentant de sérialiser le paramètre http://monServeur/wcfservices/:GetContratsResult. Le message InnerException était ‘Le nombre maximal d’éléments pouvant être sérialisés ou désérialisés dans un graphique d’objet est ‘65536’. Modifiez le graphique d’objet ou augmentez le quota MaxItemsInObjectGraph. ‘. Pour plus d’informations, consultez InnerException.

Le message d’erreur est explicite et la solution consiste à augmenter le nombre d’objets sérialisable de notre service. Pour cela, il faut modifier le comportement (behavior) de celui-ci via la balise dataContractSerializer et la propriété maxItemsInObjectGraph que nous avons augmentée à la valeur maximale : 2147483647.

<behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- Pour éviter la divulgation des informations sur les métadonnées, définissez la valeur ci-dessous sur false et supprimez le point de terminaison des métadonnées ci-dessus avant le déploiement. -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- Pour recevoir les détails d'exception des erreurs à des fins de débogage, définissez la valeur ci-dessous sur true. Définissez-la sur false avant le déploiement pour éviter la divulgation des informations d'exception. -->
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="SilverlightFaultBehavior">
          <silverlightFaults />
        </behavior>
      </endpointBehaviors>
    </behaviors>

J’espère que cela pourra vous éviter de perdre quelques heures (et quelques cheveux 😉 ).

Dans mon cas, je retiens l’utilisation de l’activation des traces qui est simple à mettre en place et qui peut se révéler très utile !!!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *