8
votes

Impossible de définir maxreceivedMessagesize via web.config

J'ai maintenant enquêté sur le code 400 - BADREQUEST pour les deux dernières heures. Beaucoup de sugestions vont à la garantie de l'attribut BindingConfiguration est définie correctement, et dans mon cas, c'est.

Maintenant, j'ai besoin de votre aide avant de détruire le bâtiment que je suis: -) p>

i courante Un service de WCF RESTFULL (très léger, utilisant cette ressource pour inspiration: http: // msdn .microsoft.com / fr-US / US / Magazine / DD315413.aspx ) qui (pour l'instant) accepte un xmlelement (POX) fourni via le verbe post-verbe. P>

Je suis actuellement en utilisant la demande de Fiddler Builder avant de mettre en œuvre un vrai client (comme il s'agit d'environnements mixtes). P>

Lorsque je le fais pour XML inférieur à 65k, cela fonctionne bien - plus grand, il jette cette exception: Le quota de taille de message maximum pour les messages entrants (65536) a été dépassé. Pour augmenter le quota, utilisez la propriété maxreceEvedMessagesize sur l'élément de liaison approprié. P>

Voici mon fichier web.config (que j'ai même inclus la balise client pour (temps désespéré!)): P>

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


0 commentaires

4 Réponses :


0
votes

Ceci est une entrée de blog que j'ai écrit qui reproduit ce problème avec un serveur WCF absolument minimal et une pièce client:

WCF - Fixation de la chaîne latérale du client Exceptions

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


5 commentaires

Bonjour Michael, merci pour votre contribution. Bien que votre article soit intéressant, mon défi jusqu'à présent est de le faire fonctionner avec Fiddler. Je suppose qu'aucun fiddler.config n'existe, je n'ai donc aucun paramétrage client à définir, ce qui ne devrait pas avoir d'importance, car je suis sûr que ce violon n'a pas de limitation. Est-ce que je me trompe ici?


Cela fonctionne donc bien à l'aide d'une ligne de commande ou d'un autre programme client .NET? Je n'aurais aucune idée de la manière de modifier violon, mais si vous avez vérifié que votre côté serveur peut gérer> 65k, le problème est définitivement du côté violet.


Le défi est que c'est une implémentation de WCF légère à terre à la terre à l'aide de la classe WebServiceHostFactory. Pour autant que je sache, cela signifie que je ne peux pas "ajouter de référence de service" car elle nécessite le format WSDL (pourquoi je n'ai pas continué avec votre lien sinon excellent).


Essayez de renommer votre liaison de WebhttpLinding à WebhttpBindingConfiguration, puis mettez à jour votre noeud final pour utiliser le nouveau nom. Voir aussi Étape 3 Ici: MSDN.MicRosoft.com/en-us/Library/ MS733051.aspx . Je ne sais pas si cela résoudra le problème, mais cela me donne certainement un mal de tête à regarder. :)


J'ai trouvé le problème; Après quelques recherches lourdes et pas de bonnes réponses sur le net, j'ai repensé la mise en œuvre vis-à-vis de la société WebServiceHostFactory. Étant donné que cela peut être utilisé sans l'entrée de configuration de ServiceModel, je doute que cela se lie jamais. J'ai donc changé la mise en œuvre et documentera ceci dans ce fil de sorte que d'autres aussi frustrés que moi, puisse trouver une solution rapide. Merci quand même pour vôtre aide :-)



13
votes

D'accord, celui-ci m'a vraiment fait du mal à résoudre, ce que je vais épargner les autres. Le défi était dans le fait que j'ai utilisé le <% @ servicehost usine = "system.servicemodel.activation.webserviceHostFactory" service = "entièrementqualiflassname"%> , qui est une approche de mise en œuvre d'usine agréable et facile .

Cependant, cette approche a des inconvénients; Étant donné qu'aucune configuration n'est nécessaire dans le fichier web.config, la classe WebServiceHostFactory de la conception n'a jamais lu dans le fichier web.config. Je connais; Je pourrais hériter de cette classe et faire les changements appropriés afin qu'il puisse vraiment lire dans le fichier de configuration, mais cela semblait un peu hors de portée.

Ma solution consistait à revenir à la manière la plus traditionnelle de Mise en œuvre de la WCF; <% @ servicehost service = "entièrementqualifiedClassName" codeBeHind = "~ / app_code / catalogue.cs"%> , puis utilisez mes valeurs déjà configurées dans le fichier web.config.

Voici mon fichier web.config modifié (en ce qui concerne les maux de tête Maddox): xxx

Un autre avantage de ce changement est que vous pouvez maintenant faire référence à votre service de repos WCF directement de .net; Cela ne peut pas être fait en utilisant le modèle d'usine et mon implémentation de xmelement via la solution.

J'espère que cela peut aider les autres avec des problèmes similaires ...


2 commentaires

J'avais le même problème et je pensais que ce serait l'usine, merci de confirmer cela pour moi.


UPVOTE Parce que ce comportement n'est vraiment pas clair et la conclusion que les services de service n'utilisent pas les liaisons de Web.Config ne semblent pas être documentés nulle part, mais semble certainement être le cas.



7
votes

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

Quoi qu'il en soit ...

Qu'est-ce que j'ai fait pour résoudre ce "problème" j'ai créé une usine héritée de WebServiceHostFactory et créé un hôte de service personnalisé hérité de WebserviceHost

et dans l'hôte I de la méthode onOntening, comme celui-ci xxx


3 commentaires

C'était très utile. J'ai utilisé cela dans un environnement SharePoint où je ne pouvais pas contrôler le web.config pour le service.


Ces rochers! Remarque: N'utilisez pas CreateBindingings () pour obtenir la liaison qu'elle ne fonctionnera pas. Utilisez la coulée comme indiqué ci-dessus. Notez également l'utilisation des usines particulières.


Pour multipleBaseaddresswebserviceHost ServiceHostHostHostHost Service: TRANSEACH (VAR CINTPOINT IN.DESCRIPTION.ENDPOINTS) {Reliure de Var = EndPoint.L'Antère comme système.ServiceModel.webhttpLinding; Reliure.MAXReceEcèdeMessagesIsize = int.maxvalue; }



6
votes

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

Observez: aucun nom de la liaison.


1 commentaires

Cela fonctionne parfaitement si vous utilisez System.ServiceModel.Activation.webserviceHostFactory.