Frage

Ich schreibe eine kleine WCF / WPF-Anwendung Bilder, um die Größe, aber WCF gibt mir Leid, wenn ich versuche, ein Bild der Größe 28K zu meinem Dienst vom Client zu senden. Der Service funktioniert gut, wenn ich es kleinere Bilder senden. Ich nahm sofort, dass dies ein Konfigurationsproblem war und ich habe die Web-Suche auf Beiträge in Bezug auf die MaxArrayLength Eigenschaft in meiner Bindungskonfiguration surften. Ive upped die Grenzen zu diesen Einstellungen auf den Client und Server auf die maximalen 2147483647, aber immer noch bekomme ich folgende Fehlermeldung:

  

Der Formatierer eine Ausnahme ausgelöst hat beim Versuch, die Nachricht deserialisieren: Es gab einen Fehler beim Versuch, deserialisieren   Parameter http://mywebsite.com/services/servicecontracts/2009/01:OriginalImage.   Die Innerexception Nachricht war ‚Ein Fehler ist aufgetreten, das Objekt vom Typ System.Drawing.Image Deserialisieren.   Die maximale Feldlänge Quote (16384) überschritten worden ist, während von XML-Daten zu lesen. Diese Quote kann durch Änderung der MaxArrayLength Eigenschaft auf dem XmlDictionaryReaderQuotas erhöht werden verwendet, Objekt, wenn die XML-Leser zu schaffen. '. Bitte sehen Innerexception für weitere Details.

Ich habe meine Client und Server hat die gleiche configs 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="me@domain.com" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

Es scheint, egal, was ich diese Werte gesetzt ich noch einen Fehler sagen wcf nicht meine Datei, weil seine mehr als 16384 Irgendwelche Ideen serialisiert können?

Update: die E-Mail-Adresse in dem userprincipal Tag ist für meine Privatsphäre geändert worden

War es hilfreich?

Lösung

My Bad - 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>
Hinweis

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

Andere Tipps

Bitte fügen Sie den <readerQuotas> in der Bindung.

Das ist das Hauptproblem beim Hochladen und Herunterladen des byte [], es mein Problem gelöst.

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

ich verwendet, um das Microsoft SDK SvcConfigEditor. Sie haben diese Option, wenn Sie Visual Studio verwenden (die ihre 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: \ Programme \ Microsoft SDKs \ Windows \ v7.1 \ Bin \ netfx 4.0   Tools \ SvcConfigEditor.exe

Wenn Sie mehrere Installationen des Microsoft SDK haben, welche Version Sie verwenden hängt davon ab, welche Version von .NET Sie unter entwickeln. Das Werkzeug wird einen Fehler werfen Sie wissen, dass Sie die DLL-Datei unter der falschen Version zu öffnen versucht.

Um das Tool, zeigen Sie auf Ihren Dienst des DLL-Datei verwenden, und lassen Sie das Werkzeug, das schwere Heben zu tun. Dies ist besonders hilfreich, wenn Sie Dienstleistungen haben im Gespräch mit Dienstleistungen (Proxies Diensten). Auch bedenken Sie, dass Sie wahrscheinlich eine Konfigurationseinstellung für beide Ihre Client (bei der Anwendung) und Server-Konfigurationen (am webservice).

müssen

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

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

Auch wurde ASP.NET pingelig diesen Wert, so dass Sie vielleicht Ihre Konfiguration verbindlich und es aus versuchen zu vereinfachen drehen:

  <serviceHostingEnvironment multipleSiteBindingsEnabled="false" />

it, s arbeiten, die zuvor anhand von net.tcp zeigt: //myservice.com/Ac_Service.svc/mex wenn Wcf-Dienst gerade, aber jetzt ist es http://myservice.com/Ac_Service.svc?wsdl

wird es in Zukunft arbeitet auch, ohne jedes Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top