Frage

Ich habe nun untersucht, die 400 - BadRequest Code für die letzten zwei Stunden. Viele sugestions geht in Richtung der bindingConfiguration Attribut sicherzustellen richtig eingestellt ist, und in meinem Fall ist es.

Nun, ich brauche Ihre Hilfe, bevor das Gebäude zu zerstören, ich bin in: -)

Ich betreiben einen WCF Restfull Service (sehr leicht, mit dieser Ressource für Inspiration: http://msdn.microsoft.com/en-us/magazine/dd315413.aspx ), die (noch) eine XmlElement (POX) versehen ist, durch die Postverb annimmt.

Ich bin zur Zeit nur Fiddler Wunsch Builder verwenden, bevor sie eine echte Client Implementierung (wie dies gemischte Umgebungen).

Wenn ich dies tun für XML kleiner als 65K, es funktioniert gut - größer, wirft es diese Ausnahme: Die maximale Nachrichtengröße Quote für eingehende Nachrichten (65536) überschritten wurde. Um die Quote zu erhöhen, die MaxReceivedMessageSize Eigenschaft auf dem entsprechende Bindungselement verwendet werden.

Hier ist meine web.config-Datei (die ich auch den Client-Tag für (verzweifelte Zeiten enthalten)!):

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

Vielen Dank im Voraus für jede Hilfe zu succesfull Anruf mit> 65K XML führt; -)

War es hilfreich?

Lösung

In Ordnung, dieser hat mich wirklich eine harte Zeit, die Lösung, die ich andere für verschonen. Die Herausforderung bestand in der Tatsache, dass ich die <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %> verwendet, die ein schöner und einfache Fabrik Implementierungsansatz ist.

Doch dieser Ansatz hat es Nachteile; da keine Konfiguration in der Datei web.config, die Klasse von Webservicehostfactory Design immer nicht aus der Datei web.config las benötigt wird. Ich weiß; Ich von dieser Klasse erben konnte, und die entsprechenden Änderungen vornehmen, so dass es in der Tat aus der Konfigurationsdatei lesen kann, aber das schien ein wenig außerhalb des Gültigkeitsbereiches.

war meine Lösung zurück in die traditionelleren Weg gehen von der WCF implementiert; <%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %>, und dann meine bereits konfigurierten Werte in der web.config-Datei verwenden.

Hier ist meine modifizierte Datei web.config (in Bezug auf Maddox Kopfschmerzen):

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

Ein weiterer Vorteil dieser Änderung ist, dass Sie jetzt Ihren WCF-Rest-Service direkt von .NET verweisen können; dies kann nicht mit dem Factory-Modell und meine Implementierung von XmlElement durch aus der Lösung durchgeführt werden.

Ich hoffe, das andere mit ähnlichen Problemen helfen kann ...

Andere Tipps

Ich weiß, dass dies eine sehr alte Frage ist, und es hat bereits eine Antwort ...

Wie auch immer ...

Was ich tat, um dieses „Problem“ zu lösen Ich habe eine Fabrik von Webservicehostfactory geerbt und erstellt eine benutzerdefinierte Diensthost von Webservicehost geerbt

Und in der Host-overrode ich die OnOpening Methode wie folgt

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

        }

Ich glaube, ich habe das gleiche Problem, aber wenn ich die konfigurierte Standard-Bindung für webHttp dann funktionierte es:

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

Beachten Sie: keinen Namen auf der Bindung.

Dies ist ein Blog-Eintrag schrieb ich, dass dieses Problem mit einem absolut minimalen WCF-Server und -Client Stück wiedergibt:

WCF - Fixing Client-Seite String-Länge Ausnahmen

Insbesondere können Sie eine benutzerdefinierte Bindung Konfiguration benötigen. Wenigstens dieses Beispiel reproduzieren können Sie einige Ideen für Ihre spezielle Situation.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top