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 une ASP.NET client WCF (j'ai ajouté la référence de service dans asp.net web application project to consume WCF).
je reçois le message suivant lorsque j'exécute l'application client:
le quota maximum de taille de message pour les messages entrants (65536) a été dépasser. Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize le élément contraignant approprié.
de l'aide? Comment augmenter le quota de taille des messages?
13 réponses
vous voudrez quelque chose comme cela pour augmenter les quotas de taille de message, dans le 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 liaison dans la configuration de votre endpoint par exemple
...
bindingConfiguration="basicHttp"
...
la justification des valeurs est simple, elles sont suffisamment grandes pour accommoder la plupart des messages. Vous pouvez ajuster ce nombre à vos besoins. La faible valeur par défaut est fondamentalement là pour prévenir les attaques de type DOS. Faire 20000000 permettrait à une attaque DOS distribuée d'être efficace, la taille par défaut de 64k exigerait un très grand nombre de clients pour dominer la plupart des serveurs de nos jours.
si vous recevez toujours ce message d'erreur pendant que vous utilisez le Client de test de la WCF, c'est parce que le client a un paramètre séparé MaxBufferSize .
pour corriger la question:
- clic droit sur le fichier de configuration noeud au bas de l'arbre
- sélectionnez Modifier avec SvcConfigEditor
une liste des paramètres modifiables apparaîtra, y compris MaxBufferSize.
Note: les clients proxy générés automatiquement ont aussi défini MaxBufferSize à 65536 par défaut.
si vous créez dynamiquement vos liaisons WCF 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;
le WCF Test Client a sa propre configuration client.
exécutez le client test et faites défiler vers le bas.
Si vous double-cliquez sur le noeud de fichier de configuration, vous verrez la représentation XML. Comme vous pouvez le voir le maxReceivedMessageSize
est 65536
.
pour éditer ceci, faites un clic droit sur le noeud de L'arbre des fichiers de configuration et sélectionnez Éditer avec SvcConfigEditor
.
Lorsque l'éditeur ouvre les reliures expand et double-cliquez sur la reliure qui était automatiquement générer.
vous pouvez éditer toutes les propriétés ici, y compris maxReceivedMessageSize
. Lorsque vous avez terminé, cliquez sur Fichier - Enregistrer .
enfin, lorsque vous êtes de retour à la fenêtre du Client Test de la WCF, cliquez sur Outils - Options .
NOTE : Décochez la case Toujours se régénérer config lors du lancement de services .
j'ai trouvé la voie de la facilité
- - - clic droit sur le webConfig ou le fichier de configuration de l'application et cliquez sur Modifier la CONFIGURATION de WCF et got to bingdigs ans select yore service et droit side show maxReciveMessageSize donner un grand nombre - -
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>
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding_Username" maxReceivedMessageSize="20000000" maxBufferPoolSize="20000000">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" establishSecurityContext="false"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint
binding="wsHttpBinding"
bindingConfiguration="wsHttpBinding_Username"
contract="Exchange.Exweb.ExchangeServices.ExchangeServicesGenericProxy.ExchangeServicesType"
name="ServicesFacadeEndpoint" />
</client>
j'ai résolu mon problème sur Bing Maps WPF sur mon projet en utilisant CalculateRoute (). La solution dans mon cas était de définir la maxReceivedMessageSize et maxReceivedMessageSize sur l'attribut " httpTransport "pour la section" customBinding".
j'ai mis dans les applications.fichier de configuration (es. myApp.config) cette configuration:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IGeocodeService" />
<binding name="BasicHttpBinding_IRouteService" />
</basicHttpBinding>
<customBinding>
<binding name="CustomBinding_IGeocodeService">
<binaryMessageEncoding />
<httpTransport manualAddressing="false" maxBufferPoolSize="524288"
maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
useDefaultWebProxy="true" />
</binding>
<binding name="CustomBinding_IRouteService">
<binaryMessageEncoding />
<httpTransport manualAddressing="false" maxBufferPoolSize="524288"
maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
useDefaultWebProxy="true" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
contract="BingServices.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
<endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc/binaryHttp"
binding="customBinding" bindingConfiguration="CustomBinding_IGeocodeService"
contract="BingServices.IGeocodeService" name="CustomBinding_IGeocodeService" />
<endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService"
contract="BingServices.IRouteService" name="BasicHttpBinding_IRouteService" />
<endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp"
binding="customBinding" bindingConfiguration="CustomBinding_IRouteService"
contract="BingServices.IRouteService" name="CustomBinding_IRouteService" />
</client>
</system.serviceModel>
une autre chose importante à considérer de mon expérience..
je conseillerais fortement de ne pas maximiser maxBufferPoolSize, parce que les tampons de la piscine ne sont jamais libérés jusqu'à ce que le domaine app (c'est-à-dire la piscine D'Application) recycle.
une période de forte circulation pourrait faire en sorte qu'une grande partie de la mémoire soit utilisée et jamais libérée.
plus de détails ici:
N'oubliez pas que l'application.la configuration du point d'entrée de l'exécution sera prise en compte, et non celle du projet de bibliothèque en classe qui gère les appels de service Web s'il y en a un.
par exemple, si vous obtenez l'erreur en exécutant unit test, vous devez configurer la configuration appropriée dans le projet de test.
j'ai eu cette erreur en utilisant ces paramètres sur le web.config
System.ServiceModel.ServiceActivationException
je mets les paramètres comme ceci:
<service name="idst.Controllers.wcf.Service_Talks">
<endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_TalksAspNetAjaxBehavior"
binding="webHttpBinding" contract="idst.Controllers.wcf.Service_Talks" />
</service>
<service name="idst.Controllers.wcf.Service_Project">
<endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_ProjectAspNetAjaxBehavior"
binding="basicHttpBinding" bindingConfiguration="" bindingName="largBasicHttp"
contract="idst.Controllers.wcf.Service_Project" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="largBasicHttp" allowCookies="true"
maxReceivedMessageSize="20000000"
maxBufferSize="20000000"
maxBufferPoolSize="20000000">
<readerQuotas maxDepth="32"
maxArrayLength="200000000"
maxStringContentLength="200000000"/>
</binding>
</basicHttpBinding>
pour HTTP:
<bindings>
<basicHttpBinding>
<binding name="basicHttp" allowCookies="true"
maxReceivedMessageSize="20000000"
maxBufferSize="20000000"
maxBufferPoolSize="20000000">
<readerQuotas maxDepth="200"
maxArrayLength="200000000"
maxBytesPerRead="4096"
maxStringContentLength="200000000"
maxNameTableCharCount="16384"/>
</binding>
</basicHttpBinding>
</bindings>
pour TCP:
<bindings>
<netTcpBinding>
<binding name="tcpBinding"
maxReceivedMessageSize="20000000"
maxBufferSize="20000000"
maxBufferPoolSize="20000000">
<readerQuotas maxDepth="200"
maxArrayLength="200000000"
maxStringContentLength="200000000"
maxBytesPerRead="4096"
maxNameTableCharCount="16384"/>
</binding>
</netTcpBinding>
</bindings>
IMPORTANT:
si vous essayez de passer un objet complexe qui a beaucoup d'objets connectés (E. g: une structure de données arborescente, une liste qui contient de nombreux objets...), la communication échouera peu importe comment vous avez augmenté les Quotas. Dans de tels cas, vous devez augmenter le nombre d'objets contenant:
<behaviors>
<serviceBehaviors>
<behavior name="NewBehavior">
...
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
</behavior>
</serviceBehaviors>
</behaviors>
Pour moi, tout ce que j'avais à faire est d'ajouter maxReceivedMessageSize="2147483647"
à l'application cliente.config. Le serveur reste intacte.