2016-06-19 2 views
1

У меня есть служба передачи файлов 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 ГБ

+0

«maxReceivedMessageSize» - это сумма переданных данных, включая все заголовки и размер данных, поскольку они фактически переданы. Если перенос в качестве мыльного сообщения и данных, например, кодируется Base64, то фактические переданные данные будут иметь много накладных расходов, поэтому вы, вероятно, нажмете на это ограничение 2 ГБ с 1,5-Гбайт-файлом. Вам нужно увеличить лимит (потребуется Int64.MaxValue, но, возможно, только в коде для привязки, см. Http://stackoverflow.com/questions/1004717/what-is-the-maximum-size-that-maxreceivedmessagesize- может-быть установлен к-в-а-сетевое_имя) – steve16351

ответ

0

Спасибо steve16351, я не понимал, что maxReceivedMessageSize был длинным. Я обновил свои файлы конфигурации с помощью Int64.MaxValue (9223372036854775807) и смог загрузить файл размером 6.8 ГБ.

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

И я изменил свою сумму на долгий, отлично работает сейчас.

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); 
} 
Смежные вопросы