Question

J'écris un service WCF pour télécharger des fichiers, mais il jette une exception lorsque la matrice d'octet a plus de 16384 éléments.

C'est le détail d'exception:

Le formateur a jeté une exception tout en essayer de désérialiser le message: Erreur dans le corps de désérialisation de la demande Message pour l'opération 'Crédocument'.La maquette maximale Du quota de longueur (16384) a été dépassé en lisant des données XML.Ce quota peut être augmenté en changeant le Propriété de la longueur maximale sur le Objet xglDictionaryReaderQuotas objet utilisé lors de la création du lecteur XML.Ligne 1, Position 22862.

La configuration pour client et serveur définit le quota de longueur maximale de la matrice à 2147483647.

Client Config:

<system.serviceModel>
  <bindings>
   <basicHttpBinding>
    <binding name="BasicHttpBinding_IDocumentLibraryService" 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="32" 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>
  <client>
   <endpoint address="http://localhost:50764/DocumentLibraryService.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDocumentLibraryService"
    contract="DocumentLibrary.IDocumentLibraryService" name="BasicHttpBinding_IDocumentLibraryService" />
  </client>

Server config:

<bindings>

            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDocumentLibraryService" closeTimeout="00:01:00"
                 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                 useDefaultWebProxy="true">
                    <readerQuotas maxDepth="2147483647"
                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="BasicHttpBinding_IDocumentLibraryService">

                <clear />
                <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="Peninsula.DocumentLibrary.ServiceLayer.IDocumentLibraryService" />
                <endpoint binding="basicHttpBinding" name="DocumentLibraryService" contract="Peninsula.DocumentLibrary.ServiceLayer.IDocumentLibraryService" address=""
                          bindingConfiguration="BasicHttpBinding_IDocumentLibraryService"/>
            </service>
        </services>

Était-ce utile?

La solution

Tout ce que je devais faire était de changer le nom de service dans le fichier web.config vers un nom de service complet avec espace de noms:

<service name="SampleNameSpace.DocumentLibraryService">

                <clear />
                <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="Peninsula.DocumentLibrary.ServiceLayer.IDocumentLibraryService" />
                <endpoint binding="basicHttpBinding" name="DocumentLibraryService" contract="Peninsula.DocumentLibrary.ServiceLayer.IDocumentLibraryService" address=""
                          bindingConfiguration="BasicHttpBinding_IDocumentLibraryService"/>
            </service>

Autres conseils

Ce n'est pas vraiment une réponse puisque votre configuration semble correcte. Je pense qu'il vous suffit de vérifier ces valeurs dans le code (sortie à tracer ou déboguer) sur l ' hôte de service et le proxy pour vous assurer que les mêmes valeurs dans la configuration sont chargées dans vos chaînes.

Il est possible qu'un autre seuil soit atteint et que l'erreur soit trompeuse

Maintenant, je déconseille fortement d'utiliser un tableau d'octets pour télécharger des fichiers , surtout si vous utilisez XML. Celles-ci seront représentées sous forme de tableaux XML et la structure sera extrêmement volumineuse en XML, ce qui prendra 10 fois plus que le fichier d'origine.

J'utiliserais:

  • WCF Streaming qui fonctionne également avec la liaison de base et est < em> super rapide
  • représente également le tableau d'octets sous forme de chaîne base64 . Cela prendra 33% d'espace supplémentaire mais pas 1 000%

MISE À JOUR

Vous pouvez tracer le nom de liaison qui a été utilisé pour configurer le service (utilisez-le dans n'importe laquelle de vos opérations WCF):

public int MyServiceOperation()
{
     Trace.WriteLine(OperationContext.Current.EndpointDispatcher.ChannelDispatcher.BindingName)
....
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top