web-dev-qa-db-fra.com

Le quota de taille de message maximum pour les messages entrants (65536) .... Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize

J'ai ce problème fou que j'essaie de résoudre. Je sais que lorsque nous obtenons une énorme quantité de données, nous devons augmenter le quota sur le fichier .config du client, mais que suis-je censé faire si mon client envoie d'énormes données "au" serveur WCF?

Cela fonctionne parfaitement normal lorsque j'envoie un paramètre d'entrée de petite taille. Malheureusement, il tombe en panne lorsque l'entrée augmente.

Débogueur, il dit:

Mauvaise demande, 400;

sur le fichier de trace c'est:

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

Existe-t-il un moyen d'augmenter ce quota de données entrantes côté serveur? si c'est le cas, comment?

Voici mes exemples de parties liées à la configuration:

<bindings>
  <basicHttpBinding>
    <binding name="MyBasicHttpBinding"
        closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00"
        sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false"
        hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647"
        maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="true">
      <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647"
          maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"  />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>

  </basicHttpBinding>
</bindings>

 <services>
  <service name="MyWcfService">
    <endpoint address="http://myservice..."
      binding="basicHttpBinding" bindingConfiguration="MyBasicHttpBinding"
      name="MyBasicHttpBinding" contract="IMyContract" />
  </service>
</services> 

et voici mon code côté client (je le crée dynamiquement):

        var binding = new BasicHttpBinding();
        binding.MaxBufferPoolSize = 2147483647;
        binding.MaxBufferSize = 2147483647;
        binding.MaxReceivedMessageSize = 2147483647;
        binding.ReaderQuotas.MaxStringContentLength = 2147483647;
        binding.ReaderQuotas.MaxArrayLength = 2147483647;
        binding.ReaderQuotas.MaxDepth = 2147483647;
        binding.ReaderQuotas.MaxBytesPerRead = 2147483647;


        var address = new EndpointAddress("http://mylocalservice.."); 

        ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(binding, address);

        foreach (OperationDescription op in factory.Endpoint.Contract.Operations)
        {
            DataContractSerializerOperationBehavior dataContractBehavior =
                        op.Behaviors.Find<DataContractSerializerOperationBehavior>()
                        as DataContractSerializerOperationBehavior;
            if (dataContractBehavior != null)
            {
                dataContractBehavior.MaxItemsInObjectGraph = 2147483646;
            }
        }
        public IMyContract MyClientObject = factory.CreateChannel();
19
rockin'

Vous pouvez définir la propriété MaxReceivedMessageSize sur le service via le fichier de configuration du service.

La définition du MaxReceivedMessageSize du client affecte uniquement les messages reçus par le client; il n'a aucun effet sur les messages reçus par le service. De même, pour permettre au service de recevoir des messages volumineux, vous devez définir le fichier de configuration du service.

Exemple de configuration de service

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="MyBinding" maxReceivedMessageSize="2147483647" />
    </wsHttpBinding>
  </bindings>
  <services>
    <service name="MyService">
      <endpoint address="http://myservice" binding="wsHttpBinding"
                bindingConfiguration="MyBinding" contract="IMyServiceContract" />
    </service>
  </services>
</system.serviceModel>

Ce qui précède est un fichier de configuration très dépouillé, mais montre les parties pertinentes. La partie importante est que vous définissez la liaison et que vous lui donnez un nom, définissez explicitement toutes les valeurs qui sont différentes des valeurs par défaut et utilisez ce nom dans l'attribut bindingConfiguration sur l'élément de noeud final.

41
Tim

Mon problème était avec le client de test wcf. Pour une raison quelconque, il ne générerait pas de configuration client avec l'augmentation de maxReceivedMessageSize. Ma solution consistait à cliquer avec le bouton droit sur "Fichier de configuration" -> "Modifier avec SvcConfigEditor" -> liaisons -> maxReceivedMessageSize.

6
thebiggestlebowski

Ce problème peut être résolu en ajoutant le nœud de liaison supplémentaire ci-dessous à la section de liaison du fichier de configuration.

<basicHttpBinding>
  <binding maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
  </binding>
</basicHttpBinding>
5
Amit S