Ich bin auf dieses anscheinend häufige Problem gestoßen und konnte es nicht lösen.
Wenn ich meinen WCF-Webdienst mit einer relativ kleinen Anzahl von Elementen in einem Array-Parameter aufrufe (ich habe bis zu 50 getestet), ist alles in Ordnung.
Wenn ich jedoch den Webdienst mit 500 Elementen aufrufe, wird der Fehler "Bad Request" angezeigt.
Interessanterweise habe ich Wireshark auf dem Server ausgeführt und es scheint, dass die Anforderung nicht einmal den Server erreicht - der 400-Fehler wird auf der Clientseite generiert.
Die Ausnahme ist:
System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (400) Bad Request. ---> System.Net.WebException: The remote server returned an error: (400) Bad Request.
Der system.serviceModel
Abschnitt meiner Client-Konfigurationsdatei lautet:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://serviceserver/MyService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyService"
contract="SmsSendingService.IMyService" name="WSHttpBinding_IMyService" />
</client>
</system.serviceModel>
Auf der Serverseite enthält meine Datei web.config den folgenden system.serviceModel
Abschnitt:
<system.serviceModel>
<services>
<service name="MyService.MyService" behaviorConfiguration="MyService.MyServiceBehaviour" >
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyService.MyServiceBinding" contract="MyService.IMyService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="MyService.MyServiceBinding">
<security mode="None"></security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MyService.MyServiceBehaviour">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Ich habe bei sieht eine ziemlich große Anzahl von Antworten auf diese Frage mit keinem Erfolg .
Kann mir jemand dabei helfen?
quelle
Antworten:
Versuchen Sie, maxReceivedMessageSize auch auf dem Server einzustellen, z. B. auf 4 MB:
<binding name="MyService.MyServiceBinding" maxReceivedMessageSize="4194304">
Der Hauptgrund, warum der Standard (65535, glaube ich) so niedrig ist, besteht darin, das Risiko von Denial-of-Service-Angriffen (DoS) zu verringern. Sie müssen festlegen, dass die maximale Anforderungsgröße auf dem Server und die maximale Antwortgröße auf dem Client größer sind. Wenn Sie sich in einer Intranet-Umgebung befinden, ist das Risiko von DoS-Angriffen wahrscheinlich gering. Daher ist es wahrscheinlich sicher, einen Wert zu verwenden, der viel höher ist als erwartet.
Übrigens ein paar Tipps zur Fehlerbehebung beim Herstellen einer Verbindung zu WCF-Diensten:
Aktivieren Sie die Ablaufverfolgung auf dem Server wie in diesem MSDN-Artikel beschrieben .
Verwenden Sie ein HTTP-Debugging-Tool wie Fiddler auf dem Client, um den HTTP-Verkehr zu überprüfen.
quelle
Ich bekam auch dieses Problem, aber keines der oben genannten Probleme funktionierte für mich, da ich nach langem Graben eine benutzerdefinierte Bindung (für BinaryXML) verwendete. Hier fand ich die Antwort: -
Senden von großem XML von Silverlight an WCF
Da ich eine customBinding verwende, muss die maxReceivedMessageSize für das httpTransport-Element unter dem Bindungselement in der web.config festgelegt werden:
<httpsTransport maxReceivedMessageSize="4194304" />
quelle
Eine weitere Überlegung bei der Verwendung von .NET 4.0 ist, dass automatisch ein Standardendpunkt erstellt und verwendet wird, wenn in Ihrer Konfiguration kein gültiger Endpunkt gefunden wird.
Der Standardendpunkt verwendet alle Standardwerte. Wenn Sie also glauben, dass Sie eine gültige Dienstkonfiguration mit einem großen Wert für maxReceivedMessageSize usw. haben, aber etwas mit der Konfiguration nicht stimmt, erhalten Sie immer noch die 400 Bad Request, da dies ein Standardendpunkt wäre erstellt und verwendet.
Dies geschieht lautlos, so dass es schwer zu erkennen ist. Diesbezügliche Meldungen (z. B. "Kein Endpunkt für Dienst gefunden, Standardendpunkt erstellen" oder ähnliches) werden angezeigt, wenn Sie die Ablaufverfolgung auf dem Server aktivieren, aber meines Wissens keine andere Anzeige gibt.
quelle
Auf dem Server in .NET 4.0 in web.config müssen Sie auch die Standardbindung ändern. Stellen Sie die folgenden 3 Parameter ein:
< basicHttpBinding> < !--http://www.intertech.com/Blog/post/NET-40-WCF-Default-Bindings.aspx - Enable transfer of large strings with maxBufferSize, maxReceivedMessageSize and maxStringContentLength --> < binding **maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"**> < readerQuotas **maxStringContentLength="2147483647"**/> < /binding>
quelle
Es kann nützlich sein, den Client zu debuggen, Extras \ Optionen \ Debugging \ Allgemein \ 'Nur meinen Code aktivieren' zu deaktivieren, auf Debug \ Ausnahmen \ 'Alle Ausnahmen der ersten Chance abfangen' für verwaltete CLR-Ausnahmen zu klicken und zu prüfen, ob es eine gibt Ausnahme unter der Haube auf dem Client vor der Protokollausnahme und bevor die Nachricht auf die Leitung trifft. (Meine Vermutung wäre eine Art Serialisierungsfehler.)
quelle
Sie können auch die WCF-Protokollierung aktivieren, um weitere Informationen zum ursprünglichen Fehler zu erhalten. Dies hat mir geholfen, dieses Problem zu lösen.
Fügen Sie Ihrer web.config Folgendes hinzu, um das Protokoll unter C: \ log \ Traces.svclog zu speichern
<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "c:\log\Traces.svclog" /> </listeners> </source> </sources> </system.diagnostics>
quelle
Ich möchte nur darauf hinweisen
Abgesehen von MaxRecivedMessageSize gibt es unter ReaderQuotas auch Attribute. Möglicherweise erreichen Sie die Anzahl der Elemente anstelle der Größenbeschränkung. MSDN Link ist hier
quelle
Ich habe die Antwort auf das Problem Bad Request 400 gefunden.
Dies war die Standardeinstellung für die Serverbindung. Sie müssten die Standardeinstellung für Server und Client hinzufügen.
Bindungsname = "" openTimeout = "00:10:00" closeTimeout = "00:10:00" receiveTimeout = "00:10:00" sendTimeout = "00:10:00" maxReceivedMessageSize = "2147483647" maxBufferPoolSize = "2147483647 "maxBufferSize =" 2147483647 ">
quelle
In meinem Fall funktionierte es nicht, obwohl alle Lösungen ausprobiert und alle Grenzen auf max. Zuletzt fand ich heraus, dass ein Microsoft IIS-Filtermodul Url Scan 3.1 auf IIS / Website installiert wurde, das seine eigene Grenze hat, um eingehende Anforderungen basierend auf der Inhaltsgröße abzulehnen und "404 Not found page" zurückzugeben.
Das Limit kann in der
%windir%\System32\inetsrv\urlscan\UrlScan.ini
Datei aktualisiert werden, indemMaxAllowedContentLength
der erforderliche Wert festgelegt wird.Zum Beispiel. Im Folgenden werden bis zu 300 MB-Anforderungen zugelassen
MaxAllowedContentLength = 314572800
Hoffe es wird jemandem helfen!
quelle