8

Ho esaminato altri messaggi, ma non ho trovato la soluzione al mio problema.Eccezione: il numero massimo di elementi che possono essere serializzati o deserializzati in un oggetto grafico è '65536'

mio servizio di file di configurazione:

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

mio file di configurazione 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> 

Perché ho ancora un'eccezione:

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 sembra ignorare <dataContractSerializer maxItemsInObjectGraph="2147483647"/> in entrambi i file App.config . Perché?

+0

@ Cybermaxs-Betclic No, non è duplicato. Sto usando "Aggiungi riferimento servizio" in Visual Studio, quindi il mio file di configurazione è corretto – Saint

risposta

1

Ho risolto questo problema aggiungendo il comportamento nel codice C#.

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

problema probabilmente è dovuta a causa di utilizzare ServiceClient costruttore con InstanceContext, Binding e EndpointAddress così il comportamento da app.config viene ignorato.

+0

Potresti spiegare dove questo codice dovrebbe andare? È in istanziazione dell'app o prima di ogni connessione? Grazie. Non capisco appieno il problema del costruttore che descrivi. – Chris

15

Al client, vedere le 3 linee marcate ****:

<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

Sì, ho provato anche questo. Ancora non funziona – Saint

+0

@Saint hmm, ok; giusto - per essere chiari: quale fine sta serializzando quando si rompe? cliente? o server? –

+0

Semms parte server per essere ok. La parte client è interrotta – Saint

5

aggiungere alla configurazione

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

Quindi definire il vostro cliente con un comportamento

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

o di farlo in codice

foreach (var operation in channelFactory.Endpoint.Contract.Operations) 
{ 
    var behavior = operation.Behaviors.Find() as DataContractSerializerOperationBehavior; 
    if (behavior != null) 
    { 
     behavior.MaxItemsInObjectGraph = 2147483647;  
    } 
} 

(Fonte: http://devlicio.us/blogs/derik_whittaker/archive/2010/05/04/setting-maxitemsinobjectgraph-for-wcf-there-has-to-be-a-better-way.aspx)

penso che si hanno per decorare la definizione lato server e l'endpoint client.

+0

Sì, ho provato anche questo. Ancora non funziona – Saint

+0

:(prova a rigenerare la configurazione del client dopo una ricostruzione –

+0

Ahh, e non dimenticare di applicare questo valore sul lato server! –