492 votes

WCF - Comment augmenter le quota de taille des messages ?

J'ai un service WCF qui renvoie 1000 enregistrements de la base de données au client. J'ai un client ASP.NET WCF (j'ai ajouté une référence de service dans le projet d'application web asp.net pour consommer WCF).

J'obtiens le message suivant lorsque je lance l'application client :

Le quota de taille maximale des messages entrants (65536) a été dépassé. dépassé. Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize de l'élément de liaison l'élément de liaison approprié.

Une aide ? Comment augmenter le quota de taille des messages ?

1 votes

J'ai eu le même problème mais j'ai juste eu une erreur réseau inamicale 400 mais la solution était le truc de la taille du message .

2 votes

J'ai résolu le problème en suivant les étapes mentionnées dans [le lien][1][1] : stackoverflow.com/questions/7476853/

0 votes

Pourquoi est-il réglé si bas par défaut ? La sécurité ?

648voto

Nate Points 14101

Vous aurez besoin de quelque chose comme ça pour augmenter les quotas de taille des messages, dans le fichier App.config ou Web.config fichier :

<bindings>
    <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000" 
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000">
            <readerQuotas maxDepth="32" 
                 maxArrayLength="200000000"
                 maxStringContentLength="200000000"/>
        </binding>
    </basicHttpBinding>
</bindings>

Et utilisez le nom de la liaison dans la configuration de votre point de terminaison, par exemple.

...
bindingConfiguration="basicHttp"
...

La justification de ces valeurs est simple, elles sont suffisamment grandes pour accueillir la plupart des messages. Vous pouvez ajuster ce nombre en fonction de vos besoins. La faible valeur par défaut est essentiellement destinée à prévenir les attaques de type DOS. Une valeur de 20000000 permettrait à une attaque DOS distribuée d'être efficace, la taille par défaut de 64k nécessiterait un très grand nombre de clients pour dominer la plupart des serveurs de nos jours.

22 votes

Cette modification doit être effectuée dans le fichier web.config de l'application cliente.

8 votes

Vous pouvez également avoir besoin de le modifier sur le serveur - dans le cas où vous devez envoyer un grand ensemble de données comme paramètre à une méthode WCF.

4 votes

Une raison particulière pour la taille du message de 20000000 ?

167voto

Michael Rodrigues Points 2932

Si vous obtenez toujours ce message d'erreur en utilisant le client de test WCF, c'est parce que le client a une section séparée MaxBufferSize réglage.

Pour corriger le problème :

  1. Cliquez avec le bouton droit de la souris sur le Fichier de configuration au bas de l'arbre
  2. Sélectionner Editer avec SvcConfigEditor

Une liste de paramètres modifiables apparaît, dont MaxBufferSize.

Note : Les clients proxy générés automatiquement définissent également MaxBufferSize à 65536 par défaut.

8 votes

Pourquoi, oh, pourquoi j'oublie toujours ça ? +1

9 votes

Sur vs2013 SvcConfigEditor est remplacé par Edit WCF configuration si les gens le cherchent.

0 votes

Vous n'arrivez pas à trouver SVCconfigEditor ?

118voto

Bharath K Points 1253

Si vous créez vos liaisons WCF dynamiquement, voici le code à utiliser :

BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.MaxReceivedMessageSize = Int32.MaxValue;
httpBinding.MaxBufferSize = Int32.MaxValue;
// Commented next statement since it is not required
// httpBinding.MaxBufferPoolSize = Int32.MaxValue;

0 votes

Vous pouvez l'utiliser pour initialiser. En clair, vous pouvez l'utiliser dans votre méthode de construction.

49voto

Jodee Dex Page Points 171

Le site Client de test WCF a sa propre configuration client.

Exécutez le client de test et faites défiler jusqu'en bas. Si vous double-cliquez sur le nœud Fichier de configuration, vous verrez la représentation XML. Comme vous pouvez le constater, le fichier maxReceivedMessageSize est 65536 .

Pour le modifier, cliquez avec le bouton droit de la souris sur le nœud de l'arborescence du fichier de configuration et sélectionnez Edit With (modifier avec). SvcConfigEditor . Lorsque l'éditeur s'ouvre, développez Bindings et double-cliquez sur la liaison qui a été générée automatiquement.

Vous pouvez modifier toutes les propriétés ici, y compris maxReceivedMessageSize . Lorsque vous avez terminé, cliquez sur Fichier - Enregistrer .

Enfin, quand vous êtes de nouveau à la fenêtre de client de test de WCF, cliquez sur Outils - Options .

NOTE : Décochez la case "Toujours régénérer la configuration lors du lancement des services". .

2 votes

Probablement la meilleure réponse ici !

3 votes

Upvote en raison de la note pour décocher la Always regenerate config option.

0 votes

La solution la plus simple à mon avis. Cela m'a épargné quelques maux de tête.

8voto

Je résous le problème ...comme suit

    <bindings>
  <netTcpBinding>
    <binding name="ECMSBindingConfig" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647" portSharingEnabled="true">
      <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
          maxStringContentLength="2147483647" maxDepth="2147483647"
          maxBytesPerRead="2147483647" />
      <security mode="None" />
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="ECMSServiceBehavior">
      <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceTimeouts transactionTimeout="00:10:00" />
      <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="100"
        maxConcurrentInstances="100" />
    </behavior>
  </serviceBehaviors>
</behaviors>

21 votes

En quoi cela diffère-t-il de ma solution ? À part que vous avez inclus toutes les parties non pertinentes de votre configuration ainsi que les parties pertinentes et que vous avez choisi la valeur maximale possible au lieu des 200m que j'ai choisis ?

4 votes

Le contexte est bon aussi... peut-être que ces deux réponses pourraient être fusionnées ?

1 votes

Ce paramètre doit-il être configuré dans le serveur ou le client ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X