Domanda

Ho esaminato il codice 400 - BadRequest nelle ultime due ore.Molti suggerimenti mirano a garantire che l'attributo bindConfiguration sia impostato correttamente e, nel mio caso, lo è.

Ora, ho bisogno del TUO aiuto prima di distruggere l'edificio in cui mi trovo :-)

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

Al momento sto utilizzando SOLO il generatore di richieste di Fiddler prima di implementare un vero client (poiché si tratta di ambienti misti).

Quando lo faccio per XML più piccoli di 65 KB, funziona bene, più grandi genera questa eccezione:La quota massima delle dimensioni dei messaggi in arrivo (65536) è stata superata.Per aumentare la quota, utilizzare la proprietà MaxReceivedMessageSize sull'elemento di associazione appropriato.

Ecco il mio file web.config (per il quale ho incluso anche il tag client (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 porti alla riuscita della chiamata con >65K XML ;-)

È stato utile?

Soluzione

Va bene, questo mi ha causato davvero difficoltà a risolverlo, per il quale ne risparmierò gli altri.La sfida stava nel fatto che ho usato il file <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %>, che è un approccio di implementazione in fabbrica semplice e piacevole.

Tuttavia, questo approccio presenta degli svantaggi;poiché non è necessaria alcuna configurazione nel file web.config, la classe WebServiceHostFactory per 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 è stata quella di tornare al modo più tradizionale di implementare la WCF; <%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %>, quindi utilizzare i valori già configurati nel file web.config.

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

<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 questa modifica è che ora puoi fare riferimento al servizio WCF-rest direttamente da .NET;questo non può essere fatto utilizzando il modello Factory e la mia implementazione di XmlElement in tutta la soluzione.

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

Altri suggerimenti

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

In ogni caso ...

Cosa ho fatto per risolvere questo " problema " Ho creato una Factory ereditata da WebServiceHostFactory e creato un host di servizi personalizzati ereditato da WebServiceHost

E nell'host ho scavalcato il metodo OnOpening in questo modo

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

        }

Penso di avere avuto lo stesso problema, ma quando ho configurato l'associazione predefinita per webHttp ha funzionato:

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

Osservare: nessun nome sull'associazione.

Questo è un post sul blog che ho scritto che riproduce questo problema con un server WCF e un pezzo client assolutamente minimi:

WCF - Correzione della lunghezza della stringa del lato client eccezioni

In particolare, potrebbe essere necessaria una configurazione di bind personalizzata. Almeno la riproduzione di questo esempio può darti alcune idee per la tua situazione particolare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top