C # 3.5 Server Out of Memory (OOM) Недостаточно памяти для сервера

СЦЕНАРИЙ. Я использую веб-формы C # с .NET framework 2.0 * (проект - 3.5, а в IIS - только 2.0). У меня есть простая форма, которая получает информацию и файлы некоторых пользователей (PDF, gif и т. Д.) И отправляет их в другое приложение. Довольно просто. Проблема в том, что в конечном итоге ОЧЕНЬ много людей (более 1000) пытаются получить к нему доступ одновременно, и использование памяти процессом IIS резко возрастает, что приводит к сбою приложения. Мы пытаемся улучшить инфраструктуру (больше памяти, веб-фермы и т. Д.), Но я хотел бы знать:

ВОПРОСЫ

  1. Мне действительно НУЖНО вручную вызывать FileUpload.FileContent.Close () и FileUpload.FileContent.Dispose (), как в предложении finally ниже? Может ли это помочь в решении вышеупомянутой проблемы? ==> ОТВЕТИЛ: ДА

  2. Если я так сделаю, может ли это испортить процесс очистки временных файлов, используемых фреймворком? ==> ОТВЕТИЛ: НЕТ

  3. Что еще я могу сделать, чтобы избежать этой проблемы? А пока я попробую изменить Webconfig, следуя этим статьям: http://support.microsoft.com/kb/821268/en-us И http://www.codeproject.com/Articles/23306/ASP-NET-Performance-and-Scalability-Secrets

CODE Вот фрагмент кода, в котором я использую FileUpload.SaveAs (). Он в основном получает сгенерированную и уже подтвержденную информацию (имя файла, расширение и т. Д.) И использует ее для сохранения fileContent загрузки файла.

    private bool GravarArquivo(FileUpload fileUpload, eXML.Anexo anexo)
    {
        bool sucesso = false;
        if (AnexoValido(fileUpload, anexo))
        {
            string path = Server.MapPath(bllProcesso.GetUrlArquivo(anexo.NomeArquivoFisico));
            try
            {
                //GRAVA ARQUIVO
                fileUpload.SaveAs(path);
                sucesso = true;
            }
            catch (Exception ex)
            {
                string mensagem = String.Format("Erro ao tentar salvar o arquivo '{0}'. Exception: '{1}'", anexo.NomeArquivoFisico, ex.Message);
                MostrarAlerta(this, mensagem);
                //throw new Exception(mensagem, ex);
            }
            //TODO: ESTUDAR O USO DESTE FINALLY, PARA VER SE DIMINUI O PROBLEMA DE MEMÓRIA DO SERVIDOR
            //finally
            //{
            //    fileUpload.FileContent.Close();
            //    fileUpload.FileContent.Dispose();
            //}
        }
        return sucesso;
    }

person erick2711    schedule 16.05.2014    source источник
comment
Короткий ответ, да. См. этот вопрос   -  person Joe    schedule 16.05.2014
comment
@ Джо, спасибо. Но как насчет временного файла FileUpload? Не испортит ли это процесс очистки?   -  person erick2711    schedule 16.05.2014


Ответы (1)


Вы всегда должны вызывать Dispose после завершения использования ресурса. Это освобождает внутренние ресурсы для использования другими приложениями.

Вызов Dispose НЕ освобождает память.

Если вы не вызовете Dispose, он будет вызываться автоматически в неопределенное время в будущем.

person Steve Wellens    schedule 16.05.2014
comment
Спасибо за ответ. Но МОГУ ли я вызвать FileUpload.FileContent.Dispose ()? Я действительно не знаю, как фреймворк обрабатывает FileUpload. Я знаю, что где-то есть временный файл, и FileUpload.FileContent.SaveAs () просто копирует его в желаемое место. Но если я вызову Dispose (), не испорчу ли я процесс очистки временного файла, что это за процесс? - person erick2711; 16.05.2014
comment
Да, вы можете смело вызывать Dispose. Операционная система обрабатывает файлы Temp, а не .NET. - person Steve Wellens; 17.05.2014
comment
Спасибо, сэр. Кстати, есть ли у вас какие-либо другие советы, что делать в программе, чтобы минимизировать описанную проблему? - person erick2711; 19.05.2014