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