Question

J'ai examiné le code 400 - BadRequest au cours des deux dernières heures. De nombreuses suggestions visent à garantir que l'attribut bindingConfiguration est correctement défini et, dans mon cas, il l'est.

Maintenant, j'ai besoin de votre aide avant de détruire l'immeuble dans lequel je me trouve: -)

J'exécute un service WCF RestFull (très léger, qui utilise cette ressource comme inspiration: http://msdn.microsoft.com/en-us/magazine/dd315413.aspx ) qui accepte (pour le moment) un XmlElement (POX) fourni par le verbe POST.

J'utilise actuellement SEULEMENT le générateur de requêtes de Fiddler avant d'implémenter un vrai client (car il s'agit d'environnements mixtes).

Lorsque je fais cela pour un XML inférieur à 65 Ko, cela fonctionne très bien. Plus gros, il lève cette exception: Le quota de taille maximale des messages entrants (65 536) a été dépassé. Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize sur l'élément de liaison approprié.

Voici mon fichier web.config (pour lequel j'ai même inclus le tag client pour (des temps désespérés!)):

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

Merci d'avance pour toute aide qui conduira à un appel réussi avec > 65K XML; -)

.
Était-ce utile?

La solution

Très bien, celui-ci m'a vraiment causé de la difficulté à résoudre, ce que je vais épargner aux autres. Le défi, c’est que j’ai utilisé la <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %> méthode d’implémentation en usine agréable et simple.

Cependant, cette approche a ses inconvénients; aucune configuration n'étant nécessaire dans le fichier web.config, la classe WebServiceHostFactory de par sa conception ne lit jamais à partir du fichier web.config. Je connais; Je pourrais hériter de cette classe et apporter les modifications appropriées pour qu’elle puisse effectivement être lue dans le fichier de configuration, mais cela semblait un peu hors de portée.

Ma solution a été de revenir à la manière plus traditionnelle de mettre en œuvre la WCF. <%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %> puis utilisez les valeurs déjà configurées dans le fichier web.config.

Voici mon fichier web.config modifié (en ce qui concerne le mal de tête de 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 autre avantage de cette modification est que vous pouvez désormais référencer votre service de repos WCF directement à partir de .NET; cela ne peut pas être fait avec le modèle Factory et mon implémentation de XmlElement via la solution.

J'espère que cela pourra aider d'autres personnes aux prises avec des problèmes similaires ...

Autres conseils

Je sais que c'est une très vieille question et qu'elle a déjà une réponse ...

Quoi qu'il en soit ...

Ce que j'ai fait pour résoudre ce " problème " J'ai créé une fabrique héritée de WebServiceHostFactory et un hôte de service personnalisé hérité de WebServiceHost

Et dans l'hôte, j'ai substitué la méthode OnOpening comme ceci

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

        }

Je pense que j'ai eu le même problème, mais lorsque j'ai configuré la liaison par défaut pour WebHttp, cela a fonctionné:

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

Observez: pas de nom sur la reliure.

Il s'agit d'une entrée de blog que j'ai écrite qui reproduit ce problème avec un serveur et un client WCF absolument minimaux:

WCF - Correction de la longueur de la chaîne du client exceptions

En particulier, vous aurez peut-être besoin d'une configuration de liaison personnalisée. Au moins, reproduire cet exemple peut vous donner quelques idées pour votre situation particulière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top