web-dev-qa-db-fra.com

maxReceivedMessageSize ne corrige pas 413: entité de requête trop grande

Mon appel à mon service Web WCF échoue avec System.Net.WebException: The request failed with HTTP status 413: Request Entity Too Large.

En vérifiant Fiddler, je vois que j'envoie:

Longueur du contenu: 149839

Ce qui est plus de 65Ko.

Activer le suivi WCF sur le serveur, je vois:

System.ServiceModel.ProtocolException: quota de taille maximale des messages pour les messages entrants (65 536) a été dépassé. Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize sur le fichier .__ approprié. élément de liaison.

L'ajout de cette propriété ne résout pas le problème.

J'ai essayé avec juste cette propriété, et (plus tard) avec divers autres que les messages ont suggéré. Voici ce que j'ai actuellement (sur le serveur) :

<basicHttpBinding>

  <binding name="PricerServiceSoap"
    closeTimeout="00:10:00" openTimeout="00:10:00"
    receiveTimeout="00:10:00" sendTimeout="00:10:00"
    maxBufferSize="2147483647"    
    maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">

    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
      maxArrayLength="2147483647" maxBytesPerRead="2147483647"
      maxNameTableCharCount="2147483647" />
  </binding>

</basicHttpBinding>

Mon seul point de terminaison (sous <client>) est:

<endpoint address="/NetPricingService/Service.asmx"
  binding="basicHttpBinding" bindingConfiguration="PricerServiceSoap"
  contract="Pricing.PricerService.PricerServiceSoap"
  name="PricerServiceSoap" />

J'ai aussi ajouté:

<dataContractSerializer maxItemsInObjectGraph="2147483647"/>

sous <behavior>.

J'ai même exécuté (pour IIS 7):

%windir%\system32\inetsrv\appcmd set config "WebServicesDev/PricingService"
-section:requestFiltering -requestLimits.maxAllowedContentLength:104857600
-commitpath:apphost

Rien ne fait de différence.

Un problème est qu'il s'agit d'un service WCF destiné à remplacer un ancien service ASMX. Le squelette de service a été généré avec svcutil à partir d'un fichier WSDL existant. Je ne peux pas modifier les configurations du client (et les clients sont dans plusieurs langues). Mon projet client test a importé le service avec Ajouter une référence Web (sous Add Service Reference / Advanced). Par conséquent, je n'ai pas de configuration WCF. Cependant, le client de test fonctionne si je le pointe vers l'ancien service ASMX.

Comment puis-je résoudre ou diagnostiquer cela?

Information additionnelle

Si j'utilise l'éditeur de configuration de service Microsoft pour générer la configuration (en définissant maxReceivedMessageSize et maxBufferSize), cela fonctionne. Le problème est que le noeud final est ensuite spécifié sous <service> et ne me permet pas de spécifier l'adresse relative /NetPricingService/Service.asmx. Si j'édite les liaisons dans la configuration générée par svcutil (où le noeud final est sous <client>), cela ne fonctionnera pas avec les demandes volumineuses.

26
TrueWill

La réponse me fixait au visage.

La configuration générée par svcutil était destinée au client. Je l'utilisais sur le serveur.

J'étais en train de modifier les liaisons pour les systèmes d'extrémité spécifiés sous <client>, ce qui ne faisait aucune différence pour le service.

L'ajout d'un point de terminaison <service> approprié et la définition de maxReceivedMessageSize et maxBufferSize sur sa liaison ont résolu le problème.

25
TrueWill

J'ai eu un problème similaire… .. Pour moi, le problème était que mon ordinateur d'extrémité ne nommait pas explicitement la liaison à l'aide debindingConfigurationet devait donc en utiliser une par défaut quelque part.

J'ai eu: 

<webHttpBinding>
    <binding 
        name="myXmlHttpBinding" 
        maxReceivedMessageSize="10485760" 
        maxBufferSize="10485760">
        <readerQuotas 
            maxDepth="2147483647" 
            maxStringContentLength="2147483647" 
            maxArrayLength="2147483647" 
            maxBytesPerRead="2147483647" 
            maxNameTableCharCount="2147483647"/>
        <security mode="None"/>
    </binding>
</webHttpBinding>

et mon point final défini comme:

<service 
    name="blah.SomeService">
    <endpoint 
        address="" 
        behaviorConfiguration="WebHttpBehavior" 
        binding="webHttpBinding" 
        contract="blah.ISomeService">

        <identity>
            <dns value="localhost"/>
        </identity>
    </endpoint>
</service>

Cela a fonctionné une fois que j'ai changé le point final en:

  <service name="blah.SomeService">
    <endpoint address="" 
        behaviorConfiguration="WebHttpBehavior" 
        binding="webHttpBinding" 
        bindingConfiguration="myXmlHttpBinding" 
        contract="blah.ISomeService">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
  </service>
24
matt burns

essayé des choses de 10 blogs différents et mon collègue a compris. nous avons dû ajouter une section basicHttpsBinding à l'intérieur de en plus de la section basicHttpBinding. Nous avons un service webapi appelant wcf. la méthode webapi détectait une erreur trop importante pour l'entité lorsqu'elle appelait la méthode de service wcf. Cette modification a été appliquée dans le fichier web.config du service wcf.

1
dmurphy

Ajoutez ceci résolvez-le pour moi:

    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_Example"
 maxBufferSize="2147483647" 
maxReceivedMessageSize="2147483647">
            </binding>
        </basicHttpBinding>
    </bindings>
0
Zvi Redler