2016-06-19 4 views
1

Ich habe einen WCF-Dateiübertragungsdienst, der QuotaExceededException wirft, wenn meine Datei größer als 1,5 GB ist. Ich habe ähnliche Beiträge gelesen, aber ich verstehe nicht, warum ich die Ausnahme erhalte oder wie ich sie beheben kann.WCF-Dateiübertragungsdienst, der QuotaExceededException wirft

System.ServiceModel.QuotaExceededException: Das maximale Nachrichtengrößenkontingent für eingehende Nachrichten (2147483647) wurde überschritten. Verwenden Sie die MaxReceivedMessageSize-Eigenschaft für das entsprechende Bindungselement, um das Kontingent zu erhöhen.

Hier ist ein Schnipsel meines Klienten app.config:

<basicHttpBinding> 
    <binding name="BasicHttpBinding_IFileTransfer" 
      maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" 
      transferMode="Streamed" 
      receiveTimeout="00:30:00" sendTimeout="01:30:00" 
      openTimeout="00:30:00" closeTimeout="00:30:00"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
         maxNameTableCharCount="16384"/> 
    </binding> 
</basicHttpBinding> 

Hier ist ein Schnipsel meines web.config:

<basicHttpBinding> 
    <binding name="FileTransfer" maxReceivedMessageSize="2147483647" 
      maxBufferSize="2147483647" transferMode="Streamed" 
      receiveTimeout="00:30:00" sendTimeout="01:30:00" 
      openTimeout="00:30:00" closeTimeout="00:30:00"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
         maxNameTableCharCount="16384"/> 
    </binding> 
</basicHttpBinding> 

Hier ist ein Schnipsel des Service-Code, der die Ausnahme ist werfen:

var sum = 0; 

try 
{ 
    FileStream targetStream; 
    var sourceStream = request.FileByteStream; 

    using (targetStream = new FileStream(tfile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     const int bufferLen = 1024 * 64; 
     var buffer = new byte[bufferLen]; 
     int count; 

     while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0) 
     { 
      targetStream.Write(buffer, 0, count); 
      sum += count; 
     } 

     targetStream.Close(); 
     sourceStream.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    Logger.Debug("sum = " + sum); // sum = 1610609664 bytes (this is 1.499997 GB) 
    Logger.LogException(ex); 
} 

Ich kann nichts größeres bekommen, dass 1,5 GB

+0

Die 'maxReceivedMessageSize' ist die Summe der übertragenen Daten, einschließlich aller Header und der Größe der Daten, die tatsächlich übertragen werden. Wenn die Übertragung als Soap-Nachricht erfolgt und die Daten zum Beispiel Base64-codiert sind, haben die übertragenen Daten eine Menge Overhead, so dass Sie diese 2-GB-Grenze wahrscheinlich mit einer 1,5-GB-Datei erreichen. Sie müssen das Limit erhöhen (es dauert Int64.MaxValue, aber möglicherweise nur in Code für die Bindung, siehe http://stackoverflow.com/questions/1004717/what-is-the-maximum-size-that-maxreceivedmessagesize- kann-für-einen-netznamen eingestellt werden) – steve16351

Antwort

0

Dank steve16351, habe ich nicht erkannt, dass maxReceivedMessageSize eine lange war. Ich habe meine Konfigurationsdateien mit Int64.MaxValue (9223372036854775807) aktualisiert und konnte eine 6,8 GB große Datei hochladen.

<basicHttpBinding> 
    <binding name="FileTransfer" maxReceivedMessageSize="9223372036854775807" maxBufferSize="2147483647" transferMode="Streamed" receiveTimeout="00:30:00" sendTimeout="01:30:00" openTimeout="00:30:00" closeTimeout="00:30:00"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384"/> 
    </binding> 
</basicHttpBinding> 

Und ich änderte meine Summe zu einem langen, funktioniert jetzt gut.

var sum = 0L; 
try 
{ 
    FileStream targetStream; 
    var sourceStream = request.FileByteStream; 
    using (targetStream = new FileStream(tfile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     const int bufferLen = 1024 * 64; 
     var buffer = new byte[bufferLen]; 
     int count; 
     while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0) 
     { 
      targetStream.Write(buffer, 0, count); 
      sum += count; 
     } 
     targetStream.Close(); 
     sourceStream.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    Logger.Debug("sum = " + sum); // no more exception 
    Logger.LogException(ex); 
}