8

J'ai regardé d'autres articles, mais je n'ai pas trouvé de solution à mon problème.Exception: le nombre maximal d'éléments qui peuvent être sérialisés ou désérialisés dans un graphique d'objet est '65536'

Mon fichier de configuration de service:

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

Mon fichier de configuration client:

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

Pourquoi je reçois encore 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. '. 

Is semble ignorer <dataContractSerializer maxItemsInObjectGraph="2147483647"/> dans les deux App.config fichiers . Pourquoi?

+0

@ Cybermaxs-Betclic Non, ce n'est pas un doublon. J'utilise "Add Service Reference" dans Visual Studio afin que mon fichier de configuration soit correct – Saint

Répondre

1

J'ai résolu ce problème en ajoutant un comportement en code C#.

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

problème est probablement dû au fait que l'utilisation constructeur ServiceClient avec InstanceContext, Binding et EndpointAddress si le comportement de app.config est ignoré.

+0

Pourriez-vous s'il vous plaît expliquer où ce code devrait aller? Est-ce sur l'instanciation de l'application? Ou avant chaque connexion? Merci.Je ne comprends pas complètement le problème de constructeur que vous décrivez. – Chris

15

Au client, voir les 3 lignes marquées ****:

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

Oui, j'ai essayé aussi. Ne fonctionne toujours pas – Saint

+0

@Saint hmm, ok; droit - pour être clair: quelle est la fin de la sérialisation quand cela casse? client? ou serveur? –

+0

Une partie du serveur doit être ok. La partie client est cassée – Saint

5

Ajouter à la configuration

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

Définissez ensuite votre client avec le comportement

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

Ou le faire en code derrière

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)

Je pense que vous devez décorer la définition du côté serveur et le point de terminaison client ainsi.

+0

Oui, j'ai aussi essayé ça. Toujours pas de travail – Saint

+0

:(essayer régénérer config client après une reconstruction –

+0

Ahh, et ne pas oublier d'appliquer cette valeur sur le côté serveur! –

Questions connexes