2011-12-05 27 views
16

Ho avuto questo problema pazzo che sto cercando di gestire. So che quando riceviamo enormi quantità di dati dobbiamo aumentare la quota sul file .config del client, ma cosa dovrei fare se il mio client invia enormi dati "al" server WCF?La quota massima di dimensione dei messaggi per i messaggi in arrivo (65536) .... Per aumentare la quota, utilizzare la proprietà MaxReceivedMessageSize

Funziona perfettamente normale quando invio parametri di input di dimensioni ridotte. Sfortunatamente, si rompe quando l'input diventa più grande.

Debugger che dice:

Bad Request, 400;

sul file di traccia è:

La quota massima dimensione del messaggio per i messaggi in arrivo (65536) è stato superato . Per aumentare la quota, utilizzare la proprietà MaxReceivedMessageSize sull'elemento di collegamento appropriato.

C'è un modo per aumentare questa quota di dati in entrata sul lato server? se é cosi, come?

parti Ecco il mio campione di configurazione correlati:

<bindings> 
    <basicHttpBinding> 
    <binding name="MyBasicHttpBinding" 
     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="2147483647" maxReceivedMessageSize="2147483647" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 

    </basicHttpBinding> 
</bindings> 

<services> 
    <service name="MyWcfService"> 
    <endpoint address="http://myservice..." 
     binding="basicHttpBinding" bindingConfiguration="MyBasicHttpBinding" 
     name="MyBasicHttpBinding" contract="IMyContract" /> 
    </service> 
</services> 

ed ecco il mio codice lato client (creo in modo dinamico):

 var binding = new BasicHttpBinding(); 
     binding.MaxBufferPoolSize = 2147483647; 
     binding.MaxBufferSize = 2147483647; 
     binding.MaxReceivedMessageSize = 2147483647; 
     binding.ReaderQuotas.MaxStringContentLength = 2147483647; 
     binding.ReaderQuotas.MaxArrayLength = 2147483647; 
     binding.ReaderQuotas.MaxDepth = 2147483647; 
     binding.ReaderQuotas.MaxBytesPerRead = 2147483647; 


     var address = new EndpointAddress("http://mylocalservice.."); 

     ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(binding, address); 

     foreach (OperationDescription op in factory.Endpoint.Contract.Operations) 
     { 
      DataContractSerializerOperationBehavior dataContractBehavior = 
         op.Behaviors.Find<DataContractSerializerOperationBehavior>() 
         as DataContractSerializerOperationBehavior; 
      if (dataContractBehavior != null) 
      { 
       dataContractBehavior.MaxItemsInObjectGraph = 2147483646; 
      } 
     } 
     public IMyContract MyClientObject = factory.CreateChannel(); 
+0

ho risolto il problema dal passo citato [qui] [1] [1]: http: // StackOverflow.it/questions/7476853/wcf-error-maximum-number-of-items-that-can-be-serialized-or-deserialized-in-an/8656402 # 8656402 – Ram

+1

Nel codice lato client si stanno impostando i readerquotas tramite codice quindi il seguente è l'approccio per impostarli: XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas(); myReaderQuotas.MaxStringContentLength = 2147483647; myReaderQuotas.MaxArrayLength = 2147483647; myReaderQuotas.MaxBytesPerRead = 2147483647; myReaderQuotas.MaxDepth = 64; myReaderQuotas.MaxNameTableCharCount = 2147483647; binding.GetType(). GetProperty ("ReaderQuotas"). SetValue (binding, myReaderQuotas, null); – Rajesh

risposta

36

È possibile impostare la proprietà MaxReceivedMessageSize sul servizio tramite il file di configurazione del servizio.

L'impostazione del client MaxReceivedMessageSize interessa solo i messaggi ricevuti dal client; non ha alcun effetto sui messaggi ricevuti dal servizio. Corrispondentemente, per consentire al servizio di ricevere messaggi di grandi dimensioni, è necessario impostare il file di configurazione del servizio.

Esempio Servizio Config

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="MyBinding" maxReceivedMessageSize="2147483647" /> 
    </wsHttpBinding> 
    </bindings> 
    <services> 
    <service name="MyService"> 
     <endpoint address="http://myservice" binding="wsHttpBinding" 
       bindingConfiguration="MyBinding" contract="IMyServiceContract" /> 
    </service> 
    </services> 
</system.serviceModel> 

Quanto sopra è un file di configurazione molto ridotta, ma mostra le parti interessate. La parte importante è che si definisce l'associazione e si assegna un nome e si impostano esplicitamente i valori diversi da quelli predefiniti e si utilizza tale nome nell'attributo bindingConfiguration sull'elemento endpoint.

+0

la cosa è che non vedo alcuna configurazione vincolante sul lato server. c'è qualche associazione di default o qualcosa del genere? come posso ignorarlo? –

+1

Sì, c'è. Se non si dispone di una sezione di collegamento specifica nel file di configurazione e non si fa riferimento nell'elemento '' tramite l'attributo bindingConfiguration, verranno utilizzati i valori predefiniti per il binding (che è 65536 per la proprietà MaxReceivedMessageSize). Quindi dovrai aggiungere la sezione '' appropriata alla configurazione. – Tim

+0

c'è qualche tipo di configurazione di binding e/o endpoint lato server? Sono già bloccato a quel punto. –

5

Questo problema può essere risolto aggiungendo il nodo di binding aggiuntivo sotto alla sezione di collegamento del file di configurazione.

<basicHttpBinding> 
    <binding maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"> 
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
    </binding> 
</basicHttpBinding> 
+3

Benvenuti in StackOverflow. L'OP ha un codice molto simile nella loro configurazione. In che modo la tua risposta è migliore di quella che avevano? Puoi migliorare la risposta spiegando che la risposta non è stata eseguita prima. – carlosfigueira

6

Il mio problema era con il client di test wcf. Per qualche ragione, non genererebbe una configurazione client con il valore maxReceivedMessageSize aumentato. La mia soluzione era quella di fare clic destro "Config file" -> "Modifica con SvcConfigEditor" -> collegamenti -> maxReceivedMessageSize.

+0

nella maggior parte delle risposte mostrano come impostare queste impostazioni sul server. ma se ancora errore allora, come hai detto, dovremmo anche configurare queste impostazioni sul client. nel mio caso, l'app.config dell'applicazione che consuma il webservice prima si presentava così: ho modificato in questo modo (vedi parte 2): – mihai71

+0

... parte 2: e ha funzionato bene. – mihai71

Problemi correlati