36 votes

Quota maximum de longueur de tableau

Je suis en train d'écrire un petit WCF, WPF/app pour redimensionner des images, mais WCF est de me donner le chagrin quand j'essaye d'envoyer une image de taille 28K à mon service auprès du client. Le service fonctionne très bien lorsque je envoyer des images plus petites. J'ai immédiatement cru que c'était un problème de configuration et j'ai parcouraient le web à la recherche à des postes concernant la MaxArrayLength bien dans ma configuration de liaison. Ive fait monter les limites de ces paramètres sur le client et le serveur au maximum de 2 147 483 647, mais encore j'obtiens l'erreur suivante:

Le formateur a déclenché une exception, tout en essayant de désérialiser le message: Il y a eu une erreur lors de la tentative de désérialiser paramètre http://mywebsite.com/services/servicecontracts/2009/01:OriginalImage. Le InnerException message était " Il y a une erreur de la désérialisation d'un objet de type System.De dessin.Image. La longueur maximale de la matrice de quota (16384) a été dépassé lors de la lecture de données XML. Ce quota peut être augmenté par la modification de la MaxArrayLength bien sur la XmlDictionaryReaderQuotas objet utilisé lors de la création du lecteur XML.'. Veuillez voir InnerException pour plus de détails.

J'ai fait mon client et le serveur configs les mêmes et elles ressemblent à ce qui suit: Serveur:

<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="32"
                              maxStringContentLength="2147483647"
                              maxArrayLength="2147483647"
                              maxBytesPerRead="2147483647"
                              maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service name="LogoResizer.WCF.ServiceTypes.ImageResizerService" behaviorConfiguration="ServiceBehavior">
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:900/mex/"/>
                    <add baseAddress="net.tcp://localhost:9000/" />
                </baseAddresses>
            </host>
            <endpoint binding="netTcpBinding" contract="LogoResizer.WCF.ServiceContracts.IImageResizerService" />
            <endpoint  address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
</system.serviceModel>

et mon client config ressemble:

 <system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="32" 
                              maxStringContentLength="2147483647"
                              maxArrayLength="2147483647" 
                              maxBytesPerRead="2147483647" 
                              maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <client>
        <endpoint address="net.tcp://localhost:9000/" binding="netTcpBinding"
            bindingConfiguration="NetTcpBinding_ImageResizerServiceContract"
            contract="ImageResizerService.ImageResizerServiceContract"
            name="NetTcpBinding_ImageResizerServiceContract">
            <identity>
                <userPrincipalName value="me@domain.com" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

Il semble peu importe ce que j'ai mis ces valeurs, je reçois toujours un message d'erreur indiquant wcf ne peut sérialiser mon dossier parce que son supérieur à 16384. Des idées?

Mise à jour: l'adresse e-mail dans le userPrincipalName tag a été modifié pour la protection de ma vie privée

38voto

Dav Evans Points 1661

My Bad - J'ai oublié d'appliquer ma configuration de liaison à mon point de terminaison dans ma configuration côté serveur. La configuration du serveur devrait se lire comme suit:

 <system.serviceModel>
	<bindings>
		<netTcpBinding>
			<binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                maxReceivedMessageSize="2147483647">
				<readerQuotas maxDepth="2147483647"
							  maxStringContentLength="2147483647"
							  maxArrayLength="2147483647"
							  maxBytesPerRead="2147483647"
							  maxNameTableCharCount="2147483647" />
				<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
				<security mode="Transport">
					<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
					<message clientCredentialType="Windows" />
				</security>
			</binding>

		</netTcpBinding>
	</bindings>
	<behaviors>
		<serviceBehaviors>
			<behavior name="ServiceBehavior">
				<serviceMetadata httpGetEnabled="true" />
				<serviceDebug includeExceptionDetailInFaults="false" />
			</behavior>
		</serviceBehaviors>
	</behaviors>
	<services>
		<service name="LogoResizer.WCF.ServiceTypes.ImageResizerService" behaviorConfiguration="ServiceBehavior">
			<host>
				<baseAddresses>
					<add baseAddress="http://localhost:900/mex/"/>
					<add baseAddress="net.tcp://localhost:9000/" />
				</baseAddresses>
			</host>
			<endpoint bindingConfiguration="NetTcpBinding_ImageResizerServiceContract" binding="netTcpBinding" contract="LogoResizer.WCF.ServiceContracts.IImageResizerService" />
			<endpoint  address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
		</service>
	</services>
</system.serviceModel>
 

Notez que bindingConfiguration = "NetTcpBinding_ImageResizerServiceContract" a été ajouté au noeud final netTcp. Mon application fonctionne maintenant avec des images plus grandes. Sucré.

6voto

Vijay Points 21

S'il vous plaît ajouter le <readerQuotas> dans la liaison.

C’est le principal problème lors du chargement et du téléchargement de l’octet [], cela a résolu mon problème.

 <basicHttpBinding>
    <binding name="ServicesBinding" transferMode="Streamed" maxBufferSize="200000000"
        maxReceivedMessageSize="200000000" messageEncoding="Text"  
        receiveTimeout="00:10:00">
        <readerQuotas maxDepth="2147483647"
            maxStringContentLength="2147483647"
            maxArrayLength="2147483647"
            maxBytesPerRead="2147483647"
            maxNameTableCharCount="2147483647" />
    </binding>
</basicHttpBinding>
 

2voto

Unequip Points 11

J'ai utilisé le kit de développement Microsoft SvcConfigEditor. Vous avez cette option si vous utilisez Visual Studio (qui a sa propre version). Il est également en téléchargement gratuit.

Sur votre disque dur (vérifier à la fois Program Files et Program Files (x86)):

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Outils\SvcConfigEditor.exe

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Outils\SvcConfigEditor.exe

Si vous avez plusieurs installations de kit de développement Microsoft, la version que vous utilisez dépend de la version de .NET vous développez sous. L'outil génère une erreur de vous laisser savoir que vous avez essayé d'ouvrir le .dll fichier pour la mauvaise version.

Utilisation de l'outil, point à votre service .dll fichier et laissez l'outil faire le levage lourd. Ceci est particulièrement utile si vous avez des services à parler à des services (procurations services). Aussi, gardez à l'esprit que vous aurez probablement besoin d'un paramètre de configuration pour votre client (à la demande) et le serveur configs (au webservice).

J'ai été absent une configuration sur le serveur-côté d'extrémité. J'ai eu à faire deux choses:

  1. Mettre un point de terminaison sur mon serveur-côté config, configuré à l'aide SvcConfigEditor
  2. N'oubliez pas de régler le MaxArrayLength dans le SvcConfigEditor outil

Aussi, ASP.NET était pointilleux sur cette valeur, de sorte que vous pourriez essayer de se simplifier la configuration de la liaison et de l'éteindre:

  <serviceHostingEnvironment multipleSiteBindingsEnabled="false" />

-2voto

Goldy Sonata Points 19

c’est le cas, affichant déjà la référence de net.tcp: //myservice.com/Ac_Service.svc/mex lors de la navigation dans le service wcf, mais qui se trouve maintenant à http://myservice.com/Ac_Service.svc?wsdl

cela fonctionnera-t-il à l'avenir également, sans aucun problème.

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