File.WriteAllBytes вызывает ошибку «Недостаточно системных ресурсов для завершения запрошенной службы» - PullRequest
9 голосов
/ 15 июня 2009

У меня есть стандартный веб-сервис SOAP с WebMethod, который принимает массив байтов, а затем выполняет

[WebMethod(true)]
WriteFile(byte[] Data, string FilePath)
{

    File.WriteAllBytes(FilePath, Data);
}

Если этому процессу передается большой файл, например, 2 мегабайта разлетается со следующим сообщением об ошибке:

Недостаточно системных ресурсов для завершить запрошенную услугу

Глядя на трассировку стека, я получаю:

  • System.IO.File.WriteAllBytes
  • System.IO.FileStream.Write
  • System.IO.FileStream.WriteCore
  • System.IO .__ Error.WinIOError
  • System.IO.IOException: недостаточно системных ресурсов для завершения запрашиваемой службы

Я пробовал все очевидные вещи, такие как установка максимальной длины запроса и выполнение тайм-аута для более реалистичных настроек:

<httpRuntime maxRequestLength="409600" executionTimeout="900"/>

Кажется, что все еще не удалось с вышеуказанным. Если вы отправляете файл меньшего размера, он отлично сохраняется на диске. Таким образом, проблема заключается в размере файла или времени.

Кто-нибудь знает что-нибудь еще, что я могу сделать, чтобы разобраться с этим?

Спасибо

Dave

Ответы [ 5 ]

3 голосов
/ 17 октября 2012

Я получал подобное сообщение об ошибке при использовании File.WriteAllBytes и изменил свой код для использования FileStream, как в примере ниже. Исходя из комментариев других, я предполагаю, что FileStream оказывает меньшее влияние на память.

        using (FileStream stream = new FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite))
        {
            stream.Write(Data, 0, Data.Length);
            stream.Close();
        }
3 голосов
/ 01 октября 2009

Я знаю, что вы не достигли этого размера файла, но также имейте в виду, что File.WriteAllBytes имеет ограничение в 64 МБ при записи в сетевые пути - см. Эту проблему connect

1 голос
/ 15 июня 2009

Я не вижу, что это может быть связано с maxRequestLength. Код находится в середине FileStream.Write, поэтому давно не возникает никаких вопросов о получении данных. Подтвердите это, посмотрев на Data.Length в отладчике.

Почему у вас есть WebMethod (правда)? Попробуйте просто [WebMethod] и посмотрите, что получится.

0 голосов
/ 21 августа 2009

WriteAllBytes загружает весь файл в оперативную память перед записью его на диск. Вам не хватает памяти.

0 голосов
/ 15 июня 2009

Значение maxRequestLength, равное 409600, ограничит размер данных до 400 КБ, поэтому размер файла 2 МБ значительно превысит это значение. Люди на GuidanceShare хорошо обсуждают подобную ситуацию. В двух словах:

  • При необходимости увеличьте maxRequestLength, как вы уже обсуждали.
  • Рассмотрите возможность реализации потоковой передачи. В .NET 1.1 используйте класс, который реализует IList в качестве объекта передачи данных, и установите HttpContext.Current.Response.BufferOutput=false; в коде на стороне клиента. .NET автоматически отправляет элементы списка по одному, поэтому каждый элемент списка может быть буфером размером 1 КБ.
  • Если вы можете использовать .NET 2 или выше, рассмотрите WCF. Это реализует потоковую передачу автоматически для привязок HTTP.

Ну, тогда это красная сельдь! Спасибо за комментарии, кажется, что я не прав.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...