2009-09-17 18 views
7

Ora ho esaminato il codice 400 - BadRequest per le ultime due ore. Un sacco di suggerimenti per assicurarsi che l'attributo bindingConfiguration sia impostato correttamente, e nel mio caso lo è.Impossibile impostare maxReceivedMessageSize tramite web.config

Ora, ho bisogno del vostro aiuto prima di distruggere l'edificio io sono in :-)

Ho eseguito un servizio WCF restfull (molto leggero, utilizzando questa risorsa per l'ispirazione: http://msdn.microsoft.com/en-us/magazine/dd315413.aspx), che (per ora) accetta un XmlElement (POX) fornito tramite il verbo POST.

Attualmente utilizzo SOLO il builder di richieste di Fiddler prima di implementare un vero client (poiché si tratta di ambienti misti).

Quando faccio questo per XML inferiore a 65K, funziona bene - più grande, genera questa eccezione: La quota massima delle dimensioni dei messaggi per i messaggi in arrivo (65536) è stata superata. Per aumentare la quota, utilizzare la proprietà MaxReceivedMessageSize sull'elemento di collegamento appropriato.

Ecco il mio file web.config (che ho inserito anche il cliente-tag per (tempi disperati)!):

<system.web> 
    <httpRuntime maxRequestLength="1500000" executionTimeout="180"/> 
    </system.web> 
    <system.serviceModel> 
    <diagnostics> 
     <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
    <bindings> 
     <webHttpBinding> 
     <binding name="WebHttpBinding" maxReceivedMessageSize="1500000" maxBufferPoolSize="1500000" maxBufferSize="1500000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"> 
      <readerQuotas maxStringContentLength="1500000" maxArrayLength="1500000" maxBytesPerRead="1500000" /> 
      <security mode="None"/> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="" binding="webHttpBinding" bindingConfiguration="WebHttpBinding" contract="Commerce.ICatalogue"/> 
    </client> 
    <services> 
     <service behaviorConfiguration="ServiceBehavior" name="Catalogue"> 
     <endpoint address="" 
        behaviorConfiguration="RestFull" 
        binding="webHttpBinding" 
        bindingConfiguration="WebHttpBinding" 
        contract="Commerce.ICatalogue" /> 
     <!-- endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/--> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="RestFull"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/> 
      <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Grazie in anticipo per qualsiasi aiuto che conduce alla chiamata di successo con> 65K XML; -)

risposta

12

Va bene, questo mi ha davvero reso difficile risolvere, per cui risparmierò gli altri. La sfida consisteva nel fatto che usavo lo <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %>, che è un approccio di implementazione di fabbrica semplice e facile.

Tuttavia, questo approccio presenta degli inconvenienti; poiché non è necessaria alcuna configurazione nel file web.config, la classe WebServiceHostFactory di progettazione non legge mai dal file web.config. Lo so; Potrei ereditare da questa classe, e apportare le modifiche appropriate in modo che possa effettivamente leggere dal file di configurazione, ma questo sembrava un po 'fuori portata.

La mia soluzione era tornare al modo più tradizionale di implementare la WCF; <%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %> e quindi utilizzare i miei valori già configurati nel file web.config.

Ecco il mio file modificato web.config (rispetto al Maddox mal di testa):

<system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="XmlMessageBinding" maxReceivedMessageSize="5000000" maxBufferPoolSize="5000000" maxBufferSize="5000000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"> 
      <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" maxBytesPerRead="5000000" /> 
      <security mode="None"/> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service name="fullyQualifiedClassName" behaviorConfiguration="DevelopmentBehavior"> 
     <endpoint name="REST" address="" binding="webHttpBinding" contract="fullyQualifiedInterfaceName" behaviorConfiguration="RestEndpointBehavior" bindingConfiguration="XmlMessageBinding" /> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="RestEndpointBehavior"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="DevelopmentBehavior"> 
      <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/> 
      <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
     <behavior name="ProductionBehavior"> 
      <serviceDebug httpHelpPageEnabled="false" includeExceptionDetailInFaults="false"/> 
      <serviceMetadata httpGetEnabled="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Un altro vantaggio di questo cambiamento è che ora è possibile fare riferimento il servizio WCF-resto direttamente da .NET; questo non può essere fatto usando il modello Factory e la mia implementazione di XmlElement attraverso la soluzione.

Spero che questo possa aiutare gli altri con problemi simili ...

+0

Avevo lo stesso problema e ho pensato che potesse essere la fabbrica, grazie per aver confermato questo per me. – Alex

+0

Upvote perché questo comportamento non è chiaro e la conclusione che ServiceRoutes non utilizza i collegamenti da Web.Config non sembra essere documentata da nessuna parte, ma sembra essere il caso. –

0

questo è un blog che ho scritto che riproduce questo problema con un server e client pezzo assolutamente minima WCF:

WCF - Fixing client side string length exceptions

In particolare, potrebbe essere necessaria una configurazione di binding personalizzata. Almeno riproducendo questo esempio può darti qualche idea per la tua situazione particolare.

+0

Ciao Michael, Grazie per l'input. Sebbene il tuo articolo sia interessante, la mia sfida finora è farla funzionare con Fiddler. Presumo che non esista fiddler.config, quindi non ho impostazioni client da impostare, il che non dovrebbe avere importanza, come sono sicuro, che Fiddler non ha una limitazione. Mi sbaglio qui? –

+0

Quindi funziona correttamente usando una riga di comando o un altro programma client .NET? Non avrei idea di come modificare Fiddler, ma se hai verificato che il tuo server può gestire> 65k, il problema è sicuramente sul lato di Fiddler. –

+0

La sfida è che questa è un'implementazione WCF leggera e leggera che utilizza la classe WebServiceHostFactory. Per quanto ho capito, questo significa che non posso "Aggiungere un riferimento al servizio" perché richiede il formato WSDL (perché non ho continuato con il tuo link altrimenti eccellente). –

6

So che questa è una domanda molto vecchio e ha già una risposta ...

Comunque ...

Quello che ho fatto per risolvere questo "problema" Ho creato una fabbrica ereditata dal WebServiceHostFactory e creato un host Servizio personalizzato ereditato da WebServiceHost

E nell'ospite mi escludeva il metodo OnOpening come questo

protected override void OnOpening() 
     { 
      base.OnOpening(); 

      foreach (var endpoint in Description.Endpoints) 
      { 
       var binding = endpoint.Binding as System.ServiceModel.Channels.CustomBinding; 

       foreach (var element in binding.Elements) 
       { 
        var httpElement = element as System.ServiceModel.Channels.HttpTransportBindingElement; 
        if (httpElement != null) 
        { 
         httpElement.MaxBufferSize = 2147483647; 
         httpElement.MaxReceivedMessageSize = 2147483647; 
        } 
       } 
      } 

     } 
+0

Questo è stato molto utile. L'ho usato in un ambiente SharePoint in cui non potevo controllare il web.config per il servizio. – MgSam

+1

Questo rocce! Nota: non utilizzare CreateBindings() per ottenere l'associazione che non funzionerà. Usa il cast come elencato sopra. Si noti anche l'uso delle fabbriche particolari. – CCondron

+0

Fantastico !!! Grazie! – zdrsh

6

penso di aver avuto lo stesso problema, ma quando ho configurato di default vincolante per webHttp allora ha funzionato:

<bindings> 
     <webHttpBinding> 
      <binding maxReceivedMessageSize="2000000" 
         maxBufferSize="2000000"> 
       <readerQuotas maxStringContentLength="2000000"/> 
      </binding> 
     </webHttpBinding> 
    </bindings> 

Osservare: no nome sulla rilegatura.

+1

Funziona perfettamente se si utilizza System.ServiceModel.Activation.WebServiceHostFactory. – ROFLwTIME

Problemi correlati