2009-01-21 17 views
36

Ich schreibe eine kleine WCF/WPF-App, um die Größe der Bilder zu ändern, aber WCF bereitet mir Kummer, wenn ich versuche, ein Bild der Größe 28K vom Client an meinen Dienst zu senden. Der Service funktioniert gut, wenn ich kleinere Bilder sende. Ich nahm sofort an, dass dies ein Konfigurationsproblem war, und ich habe im Web nach Posts gesucht, die die MaxArrayLength-Eigenschaft in meiner Bindungskonfiguration betreffen. Ive upped die Grenzen zu diesen Einstellungen auf den Client und Server auf die maximalen 2147483647, aber ich bekomme immer noch die folgende Fehlermeldung:Maximale Array-Länge Kontingent

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.

Ich habe meinen Client und Server configs gemacht das gleiche und sie sehen wie folgt aus: Server:

<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> 

und mein Klient Config wie folgt aussieht:

<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> 

Es scheint, egal, was ich diese Werte gesetzt ich noch eine erro bekommen r sagen, dass wcf meine Datei nicht serialisieren kann, weil sie größer als 16384 ist. Irgendwelche Ideen?

Update: die E-Mail-Adresse in dem userprincipal Tag hat für meine Privatsphäre

+0

Sie können Ihre eigene Antwort als korrekt markieren. :) –

+0

was macht ImageResizerService? jeder Beispielcode? – Kiquenet

Antwort

38

My Bad verändert - Ich habe meine Bindungskonfiguration zu meinem Endpunkt in meiner serverseitige Konfiguration anzuwenden. Die Serverkonfiguration sollte lauten:

<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> 

Notiere die bindingConfiguration = „NetTcpBinding_ImageResizerServiceContract“ hinzugefügt wurde dem NetTcp Endpunkt. Meine App funktioniert jetzt mit größeren Bildern. Süss.

+0

Ich schlug gerade meinen Kopf auf dem Schreibtisch für etwa 4 Stunden geradeversucht, um dieses genaue Problem zu lösen - das gleiche Problem, die Bindung wurde nicht korrekt zugeordnet. Vielen Dank! – GalacticCowboy

+0

Hat mir auch geholfen. Vielen Dank. – mark

+0

@Dav Evans Ich habe ein gleiches Problem. Aber ich übertrage große Byte-Array zu WCF-Dienst von Windows Phone 8. Ich habe gehört, dass wp8 nur 'basicHttpBinding' unterstützt. Hast du eine Lösung? –

6

Bitte fügen Sie die <readerQuotas> in Bindung.

Das ist das Hauptproblem beim Hochladen und Herunterladen des Bytes [], es löste mein Problem.

<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

Ich habe das Microsoft SDK SvcConfigEditor verwendet. Sie haben dies, wenn Sie Visual Studio verwenden (das eine eigene Version hat). Es ist auch ein kostenloser Download.

auf Ihrer Festplatte (überprüfen beide Program Files und 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

Wenn Sie mehrere Installationen des Microsoft SDK haben, welche Version Sie auf, welche Version von .NET abhängen verwenden Du entwickelst dich unter. Das Tool wird einen Fehler ausgeben, um Sie wissen zu lassen, dass Sie versuchten, die DLL-Datei unter der falschen Version zu öffnen.

Um das Tool zu verwenden, zeigen Sie auf die DLL-Datei Ihres Diensts, und lassen Sie das Werkzeug das schwere Heben durchführen. Dies ist besonders hilfreich, wenn Sie Dienste mit Diensten unterhalten (Proxies-Dienste). Beachten Sie auch, dass Sie wahrscheinlich eine Konfigurationseinstellung für Ihren Client (bei der Anwendung) und Serverkonfiguration (beim Webservice) benötigen.

Ich fehlte eine Konfiguration auf dem serverseitigen Endpunkt.Ich hatte zwei Dinge zu tun:

  1. einen Endpunkt auf meinem Server-Side-Config-Put, konfiguriert mit SvcConfigEditor
  2. Denken Sie daran, die MaxArrayLength im SvcConfigEditor Werkzeug

Auch zu setzen, ASP.NET war pingelig diesen Wert, so können Sie versuchen, Ihre Konfiguration verbindlich und es weg zu vereinfachen Drehen:

<serviceHostingEnvironment multipleSiteBindingsEnabled="false" /> 
-2

es, s arbeiten, die zuvor anhand von net.tcp zeigt: // mys ervice.com/Ac_Service.svc/mex beim Durchsuchen des WCF-Service, aber jetzt ist es http://myservice.com/Ac_Service.svc?wsdl

wird es in Zukunft auch funktionieren, ohne jedes Problem.

Verwandte Themen