2009-01-21 5 views
36

J'écris une petite application WCF/WPF pour redimensionner des images mais WCF me donne du chagrin quand j'essaie d'envoyer une image de taille 28K à mon service du client. Le service fonctionne bien quand je lui envoie des images plus petites. J'ai immédiatement supposé qu'il s'agissait d'un problème de configuration et j'ai repéré le Web en consultant les publications concernant la propriété MaxArrayLength dans ma configuration de liaison. Ive fait monter les limites de ces paramètres à la fois le client et le serveur au 2147483647 maximale mais je reçois l'erreur suivante:Quota maximal de longueur de tableau

The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://mywebsite.com/services/servicecontracts/2009/01:OriginalImage . The InnerException message was 'There was an error deserializing the object of type System.Drawing.Image. The maximum array length quota (16384) has been exceeded while reading XML data. This quota may be increased by changing the MaxArrayLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.'. Please see InnerException for more details.

J'ai fait mon client et le serveur configs même et ils 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 ma config client 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="[email protected]" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Il semble peu importe ce que je mets ces valeurs que je reçois toujours un Erro r disant que wcf ne peut pas sérialiser mon fichier car c'est plus grand que 16384. Des idées?

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

+0

Envisagez de marquer votre propre réponse comme correcte. :) –

+0

qu'est-ce que ImageResizerService? un exemple de code? – Kiquenet

Répondre

38

My Bad - J'ai oublié d'appliquer ma configuration de liaison à mon point final dans ma config côté serveur. La configuration du serveur doit lire:

<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 le bindingConfiguration = « NetTcpBinding_ImageResizerServiceContract » a été ajouté à l'extrémité NetTcp. Mon application fonctionne maintenant avec des images plus grandes. Doux.

+0

J'ai juste battu ma tête sur le bureau pendant environ 4 heures d'affilée en essayant de résoudre ce problème exact - même problème, la liaison n'a pas été cartographiée correctement. Merci! – GalacticCowboy

+0

m'a aussi aidé. Merci. – mark

+0

@Dav Evans J'ai le même problème. Mais je transfère un grand tableau d'octets au service WCF à partir de Windows Phone 8. J'ai entendu que wp8 ne supporte que basicHttpBinding. Alors avez-vous une solution à ce sujet? –

6

Veuillez ajouter le <readerQuotas> dans la liaison.

C'est le problème principal 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> 
2

J'ai utilisé Microsoft SDK SvcConfigEditor. Vous avez cela si vous utilisez Visual Studio (qui a sa propre version). C'est aussi un 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 Tools\SvcConfigEditor.exe

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

Si vous avez plusieurs installations du SDK Microsoft, la version que vous utilisez dépend de quelle version de .NET vous développez sous. L'outil va lancer une erreur pour vous faire savoir que vous avez essayé d'ouvrir le fichier .dll sous la mauvaise version.

Pour utiliser l'outil, pointez sur le fichier .dll de votre service et laissez l'outil effectuer le gros du travail. Ceci est particulièrement utile si vous avez des services de parler aux services (services proxy). De plus, gardez à l'esprit que vous aurez probablement besoin d'un paramètre de configuration pour votre client (à l'application) et les configurations du serveur (sur le webservice).

Il me manquait une configuration sur le point de terminaison côté serveur.Je devais faire deux choses:

  1. mettre un point final sur ma config côté serveur, configuré à l'aide SvcConfigEditor
  2. Rappelez-vous de régler la MaxArrayLength dans l'outil SvcConfigEditor

En outre, ASP.NET était être pointilleux sur cette valeur, vous pouvez essayer de simplifier votre configuration de liaison et de le désactiver:

<serviceHostingEnvironment multipleSiteBindingsEnabled="false" /> 
-2

il, s de travail, montrant précédemment référence net.tcp: // MYS ervice.com/Ac_Service.svc/mex lors de la navigation sur le service wcf mais maintenant c'est http://myservice.com/Ac_Service.svc?wsdl

va-t-il fonctionner à l'avenir aussi, sans aucun problème.

Questions connexes