13

sto ricevendo il seguente errore in una chiamata WCF:WCF errore "Il numero massimo di elementi che possono essere serializzati o deserializzati in un oggetto grafico è '65536'"

Il numero massimo di elementi che possono essere serializzato o deserializzato in un oggetto grafico è '65536'

ho letto un sacco di post del forum e molti di loro citare la modifica del app.config e web.config per specificare nuovo comportamento per consentire grafi di oggetti più grandi. Ho fatto che, e questo è quello che ho in questi file:

App.config al progetto 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 sul progetto di servizio:

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

Questo, tuttavia, non ha aiutato. Si noti che i servizi a cui si fa riferimento in APP.CONFIG non sono i servizi con cui ho problemi.

Ho anche provato la seguente:

  • aggiunto questi attributi per l'implementazione del servizio: [DataContract (IsReference = true)], [ServiceBehavior (AddressFilterMode = AddressFilterMode.Any, MaxItemsInObjectGraph = 2147483646)]

  • ha scritto una classe DataContractSerializerOperationBehavior personalizzata che imposta il comportamento MaximumObjectsInGraph e IsReference. Aggiunto anche Attributo personalizzato per applicare questo le implementazioni del servizio. Per motivi di ingombro, non ho inserito il codice, ma posso aggiungerlo se qualcuno pensa che sarebbe utile.

Pensieri? Idee? Dove vado da qui?

Grazie in anticipo!

risposta

4

Ho appena realizzato che il file di configurazione WPF non è corretto. Così, ho cancellato tutti i miei commenti perché stavano assumendo una configurazione WCF valida. Il tuo file di configurazione WPF non è corretto ... ha bisogno di dire "Client" invece di servizio ... Stai utilizzando "Aggiungi riferimento servizio" in Visual Studio? se è così, dovrebbe aver creato il file di configurazione corretto per te.

In caso contrario, fare riferimento a MSDN per il formato corretto per il file di configurazione del client nel progetto WPF.

+0

ho aggiunto altro da sezioni del modello system.service da entrambi i file di configurazione – Scot

+0

aha! ... penso che tu potrebbe essere su qualcosa ... Controllerò di aggiungere la sezione "Client". Cordiali saluti - questo è un progetto che ho ereditato da un altro team, non ho idea del metodo che hanno usato per generare il file app.config per l'app WPF. – Scot

+0

Prova ad aggiungere un "Servizio di riferimento" in Visual Studio e non dimenticare di cancellare l'intera sezione "system.servicemodel" nel tuo app.config prima di aggiungere il riferimento al servizio ... la tua vita sarà molto più facile ... e quindi puoi personalizzare il tuo file di configurazione aggiungendo la roba 'maxItemsInObjectGraph' ... buona fortuna. – Nabheet

5

Avete provato ad alzare anche il buffer e la dimensione massima del messaggio ricevuto?

maxBufferSize="6553600" maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600" 
+0

Questo dovrebbe andare nel web.config del progetto di servizio host? o l'app.config del client? o entrambi? – Scot

+0

sull'app.config dell'applicazione. – Josh

+0

questo è un territorio inesplorato per me ... :-) è questo l'approccio giusto? Scot

12

La configurazione dei valori riportati di seguito ha risolto il problema.

configurazione client:

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

Server Config:

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

Ciao, provo a usare il tuo codice (binding e comportamento ma ottengo questo messaggio di errore: ** Tipo di contenuto text/xml; charset = utf-8 non era supportato dal servizio **. Hai qualche idea del perché io ricevi questo messaggio di errore? – NoOne

0

si restituisce un elenco generico o un array, che ha una dimensione di più di 65536. nelle query, utilizzando un top 60000 selezionato o non aggiungendo più di 60k elementi risolverà il tuo problema.

1

Attenzione all'elemento "dataContractSerializer". Nel mio caso ho ricevuto l'errore menzionato fino a quando ho inserito questo elemento come primo elemento dell'elemento genitore "comportamento". Almeno sul lato client davvero.

Problemi correlati