У меня есть служба передачи файлов WCF, которая бросает QuotaExceededException
, когда мой файл больше 1,5 ГБ. Я просмотрел похожие сообщения, но я не понимаю, почему я получаю исключение или как его разрешать.Служба передачи файлов WCF, которая бросает QuotaExceededException
System.ServiceModel.QuotaExceededException: превышена максимальная квота размера сообщений для входящих сообщений (2147483647). Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize в соответствующем связывающем элементе.
Вот надрез моего клиента 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>
Вот надрез моего 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>
Вот надрез кода сервиса, который бросает исключение:
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);
}
Я не могу получить ничего большего, чем 1,5 ГБ
«maxReceivedMessageSize» - это сумма переданных данных, включая все заголовки и размер данных, поскольку они фактически переданы. Если перенос в качестве мыльного сообщения и данных, например, кодируется Base64, то фактические переданные данные будут иметь много накладных расходов, поэтому вы, вероятно, нажмете на это ограничение 2 ГБ с 1,5-Гбайт-файлом. Вам нужно увеличить лимит (потребуется Int64.MaxValue, но, возможно, только в коде для привязки, см. Http://stackoverflow.com/questions/1004717/what-is-the-maximum-size-that-maxreceivedmessagesize- может-быть установлен к-в-а-сетевое_имя) – steve16351