2012-04-06 5 views
2

Es gibt mehrere ähnliche Fragen auf SO (fast gleichen Titel), keiner von ihnen hat mir geholfen, zu beheben mein Problem. Bitte schließen Sie meine Frage nicht als Duplikat vor dem Lesen . Vielen Dank.Fehler 400 (bad request): MaxReceivedMessageSize nicht berücksichtigt für meine WCF-Dienst

Ich verwende derzeit WCF, um einen Webservice (SOAP, HTTP) verfügbar zu machen. Es wird vorerst in IIS Express bereitgestellt. Mein Problem ist, ich kann es nicht schaffen, meinen Service von meinem Kunden zu konsumieren. Mein Kunde erhält eine Ausnahme HTTP Error 400 Bad request.

ich dann habe aktiviert auf Server-Seite verfolgt, um zu sehen, was tatsächlich passiert, ist hier, was ich bekommen:

enter image description here

ich die Fehlermeldung ins Englische übersetzt haben: The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element..

Ziemlich selbsterklärend, eigentlich. Da meine SOAP-Nachricht sehr umfangreich ist, überschreitet sie wahrscheinlich das Limit von 64 KB.

Ich entschied, diese Grenze in der Bindungskonfiguration zu erweitern. Also hier ist mein web.config (Server-Seite):

<services> 
    <service name="MyServiceName"> 
    <endpoint binding="basicHttpBinding" 
       bindingConfiguration="MyBindingConfiguration" 
       bindingNamespace="http://my_namespace" 
       contract="XXX.IMyContract" /> 
    </service> 
</services> 

<bindings> 
    <basicHttpBinding> 
    <binding name="MyBindingConfiguration" 
      allowCookies="true" 
      maxReceivedMessageSize="2147483647" 
      maxBufferSize="2147483647" 
      maxBufferPoolSize="2147483647"> 
     <readerQuotas maxDepth="32" maxArrayLength="2147483647" maxStringContentLength="2147483647" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Wie Sie sehen können, alle Größen sind auf int.MaxValue.

Ich habe auch meine Klienten app.config geändert, hier ist es:

<bindings> 
    <basicHttpBinding> 
    <binding name="MyBindingName" 
      allowCookies="false" 
      bypassProxyOnLocal="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2147483647" 
      maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" 
      textEncoding="utf-8" 
      transferMode="Buffered" 
      useDefaultWebProxy="true"> 

     <readerQuotas maxDepth="32" 
        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://localhost:8083/myAddress.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="MyBindingName" 
      contract="IMyContract" 
      name="MyBindingName" /> 
</client> 

ich dann meinen Dienst umgeschichtet, und das Problem war immer noch hier (HTTP 400, Bad request auf Client-Seite + MaxReceivedMessageSize limited to 65536 auf Server-Seite).

Ich testete dann meinen Service mit einer sehr kleinen SOAP-Nachricht: alles ist perfekt in Ordnung. Also das Problem ist wirklich, dass meine Nachricht größer als 64KB ist.

Ich verbrachte 2 Stunden gestern, um herauszufinden, was das Problem mit meiner Konfiguration ist ... Wahrscheinlich etwas offensichtlich, aber ich kann nicht finden ...

ich viel über dieses Problem gegoogelt habe, 95 In% des Problems hat der Entwickler vergessen, das Attribut bindingConfiguration im Dienstendpunkt anzugeben. Wie Sie in meiner web.config oben sehen können, ist es in Ordnung für mich.

Dann habe ich another question on stackoverflow about the (almost) same issue gefunden.

Als Autor sagte in seiner Frage, den Namen der Bindungskonfiguration zu string.Empty „fixen“ der Problemstellung:

<services> 
    <service name="MyServiceName"> 
    <endpoint binding="basicHttpBinding" 
       bindingConfiguration="" 
... 

<bindings> 
    <basicHttpBinding> 
    <binding name="" 
... 

Wenn die Standardbindung verwenden, funktioniert alles einwandfrei. Ich kann mein Problem nicht nur mit dieser Problemumgehung beheben, da ich in derselben web.config mehrere unterschiedliche Bindungskonfigurationen angeben muss.

Ich erstelle eine Frage hier, weil es nicht wirklich die gleichen Bedingungen ist: Mein Dienst ist nicht selbst gehostet, aber in IIS Express gehostet (oder IIS 7.5, getestet, dasselbe Problem).

Ich habe eine similar issue here mit einem selbst gehosteten Dienst gefunden, und das Problem wurde auf diese Besonderheit bezogen. Ich denke also, dass es zwischen diesen 2 SO-Fragen etwas anderes gibt.

Ich denke, da ist etwas offensichtlich falsch in meiner Konfiguration, aber ich kann was nicht finden. Jede Hilfe wird geschätzt.

+2

Alles scheint auf den ersten Blick in Ordnung zu sein - nur Punkt ist: die '" attribute ** muss ** genau zu Ihrer voll qualifizierten Service-Implementierungsklasse passen (einschließlich aller Namespaces etc.) - ist das der Fall? Ich frage, weil Sie 'contract =" XXX.IMyContract "' haben, der einen Namensraum anzeigt, aber Ihr 'serviec Name =" .... "' Attribut hat keinen Namensraum, der an angedeutet wird. –

+0

Was Sie tun könnten Ihre Server- (und Client-) Konfiguration soll ** No Name ** für die Bindungskonfiguration definieren, z have '' ohne ein 'name =" MyBinding "' Attribut. In diesem Fall wird diese Bindungskonfiguration auf ** alle ** Endpunkte angewendet, die diese Bindung verwenden (wenn sie keine spezifische zu verwendende Bindungskonfiguration angeben). –

+0

@marc_s Sie haben absolut Recht: Ich habe vergessen, den Namespace für den Dienstnamen anzugeben. Ich habe gerade meinen Service mit dem vollen qualifizierten Namen getestet, er funktioniert jetzt wie erwartet! Ich hätte das nie alleine gefunden. Warum zur Hölle funktionierte mein Service perfekt mit einer kleinen SOAP-Nachricht? Das Angeben des Dienstnamens ohne den Namespace hat die Bindungskonfiguration abgebrochen, nicht den Dienst selbst (es funktioniert sogar für eine kleine Nachricht mit einem zufälligen Namen!). Dies ist ein sehr seltsames Verhalten IMO. Wie auch immer, du hast mein Problem gelöst, schreibe das bitte als Antwort, damit ich es annehmen kann. Danke vielmals. – ken2k

Antwort

4

Alles scheint auf den ersten Blick in Ordnung zu sein - nur Punkt ist: das <service name="....."> Attribut muss genau auf Ihre vollqualifizierten Service-Implementierungsklasse entsprechen (einschließlich aller Namensräume etc.) - ist, dass der Fall ??

Ich frage, weil Sie contract="XXX.IMyContract" einen Namespace angeben, aber Ihr <service name="...."> Attribut hat keinen Namespace angedeutet.

+0

Das hat mein Problem behoben, danke. Wie in den Kommentaren gesagt, "Die Angabe des Dienstnamens ohne Namespace hat die Bindungskonfiguration zerstört, nicht den Dienst selbst (es funktioniert sogar gut für eine kleine Nachricht mit einem zufälligen Namen!)". Darf ich Sie fragen, ob Sie wissen, warum sich der Dienst so verhält? – ken2k

+2

@ ken2k: Ich glaube, dass Sie zu einem "Opfer" der neuen WCF 4 Standardverhalten geworden sind. Wenn WCF 4 keine Konfiguration für einen Dienst finden kann (weil er nicht vorhanden ist oder der Dienstname falsch geschrieben ist), verwendet er nur einige Systemstandardwerte - wie HTTP als Protokoll und eine Bindung für HTTP. Dies ist höchstwahrscheinlich das, was Ihnen passiert ist - die WCF 4-Laufzeit hat Ihren Dienst gestartet - aber nur mit Standardeinstellungen, z. Die Standardgröße der 64K-Nachrichten - obwohl Sie eine Konfiguration hatten. –

+3

marc_s, Ich wollte dir für deine gründliche Erklärung zu dieser Angelegenheit danken (dies hat gerade ein identisches Problem gelöst, das ich hatte). Was für ein frustrierendes "Feature", dieses Standardverhalten ist Unsinn. –

0

Versuchen durch die folgenden Web-config-Einstellungen in Service:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    <standardEndpoints> 

      <webHttpEndpoint> 
       <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"           
            crossDomainScriptAccessEnabled="true" 
            maxReceivedMessageSize="2147483647" 
            maxBufferSize="2147483647" 
            maxBufferPoolSize="4194304" /> 
      </webHttpEndpoint> 

    </standardEndpoints> 

    <bindings> 
     <webHttpBinding> 
      <binding> 
       <readerQuotas maxStringContentLength="2147483647"/> 
      </binding> 
     </webHttpBinding> 
    </bindings> 

</system.serviceModel> 

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 
Verwandte Themen