2012-05-25 4 views
1

Я получаю «Исключение из памяти» при отправке больших данных с помощью веб-служб. Он отлично работает для небольшого объема данных. Сценарий похож: Здесь у меня есть класс сущностей, называемый clsMovie. Здесь пользователь загружает большой файл объемом более 250 МБ. Этот файл преобразуется в байты массива и присваивается члену MovieData класса clsMovie. , когда объект этого класса передается веб-службе с большим объемом данных (большие байты массива), я получаю «Исключение из памяти».'System.OutOfMemoryException' при отправке большого количества данных в webservice C#

Кодекс:

MovieResponse objM = service.SaveProductMovie(objMovieEnt);  // I get "Out of Memory Exception". 


    [DataContract] 
    [Serializable] 
    public class clsMovie 
    { 
     [DataMember] 
     public byte[] MovieData { get; set; } 

     [DataMember] 
     public string MovieType { get; set; } 

     [DataMember] 
     public int MovieSize { get; set; } 

    } 

Я пытался использовать WSE 3.0 инструмент, но он не поддерживается в VS 2008, а также я гугле много, но все напрасно. У кого-нибудь есть решение?

+0

Возможный дубликат [Есть ли ограничения на использование памяти в приложении ASP.Net?] (Http://stackoverflow.com/questions/525894/is-there-any-memory-restrictions-on-an-asp-net -application) – Reniuz

+1

Изменение веб-службы для использования chunking (отправьте его в некоторых частях 1MB, например) должно сделать эту ошибку уйти. Использование веб-сервисов и отправка огромных объемов данных на самом деле не так. – CodingBarfield

+0

@Reniuz: это не дубликат. – ravidev

ответ

1

Отправка массива в 250 МБ по web-сервису занимает много памяти, для обработки массива требуется, вероятно, 3 раза 250 МБ свободной памяти. Что произойдет, если у вас 10 пользователей? Кроме того, размер вашего файла размером 250 МБ примерно в 10 раз превышает размер, если вы делаете сообщение с мылом, которое представляет собой xml, и каждый байт преобразуется в теги char + xml.

Есть лучшие протоколы, а затем веб-серверы для отправки больших файлов, например, вы можете использовать ftp и отправлять имя загруженного файла по веб-сайтам, когда загрузка ftp завершена. Или сделать патрон 5 МБ и объединить, когда последний патрон там.

0

Вы можете проверить файл конфигурации для квоты размера в вашем переплета.

<basicHttpBinding> 
    <binding name="BasicHttpBinding_ForgotPasswordService" closeTimeout="00:10:00" 
     openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    </binding> 
</basicHttpBinding> 

Возможно, вы сможете настроить maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" в соответствии с вашими потребностями.

Но в вашем индивидуальном случае я бы желательно рассмотреть возможности потоковой передачи ФОС, как здесь: "Large Data and Streaming in WCF" (MSDN)

[EDIT]

Думая об этом, если бы вы попали ограничения квот, исключение, скорее всего, будет отличаться и сказать, что вам нравится «Максимальная квота длины массива превышена» или что-то подобное.

OutOfMemoryException может иметь больше общего с фактическими пределами хотя бы одной из коммуникационных систем. Возможной причиной может быть некоторая ошибка утечки памяти, набирая данные в ОЗУ и не очищая должным образом (или достаточно быстро).

+0

Я внес изменения в файл конфигурации, но не работал. Я использую asp.net webservice не WCF. – ravidev

+0

@ravidev: См. Мое редактирование. –

+0

нет утечки памяти. Я не могу отправить байты массива размером более 128 МБ. – ravidev

Смежные вопросы