Файл загрузки ASP.NET Core 3.1 MVC не найден до тех пор, пока пул приложений IIS не перезапустит или не запустит веб-сайт с локального хоста

Я делаю ASP.NET Core 3.1 MVC с веб-сайтом Entity Framework на сервере Microsoft, на котором работает IIS 10, с базовыми функциями загрузки и выгрузки пользовательских файлов. Я могу загружать файлы в _webHostEnvironment.WebRootPath из Интернета, но когда я пытаюсь их загрузить, он не может их найти. Однако, если я перерабатываю пул приложений, я могу загрузить файл (я также могу загрузить его из Интернета после доступа к веб-сайту на локальном хосте на сервере).

Вот код, когда я загружаю файл:

string uniqueFileName = null;
if (model.Data != null)
{
    string uploadsFolder = Path.Combine(_webHostEnvironment.WebRootPath, "images");
    uniqueFileName = Guid.NewGuid().ToString() + "_" + model.Data.FileName;
    string filePath = Path.Combine(uploadsFolder, uniqueFileName);
    model.Data.CopyTo(new FileStream(filePath, FileMode.Create));
}

Вот код, когда я загружаю его:

public FileResult DownloadData(string fileName, string tempAddCode, string patientName)
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(Path.Combine(_webHostEnvironment.WebRootPath, "images") + "\\" + fileName);
    var dataStream = new MemoryStream(fileBytes);
    return new FileStreamResult(dataStream, new MediaTypeHeaderValue("application/pdf"))
    {
        FileDownloadName = patientName.ToLower().Replace(" ", "_") + ".pdf"
    };
}

Что происходит? Почему переработка пула приложений может исправить это? Я сохраняю эти файлы, загруженные пользователем, в неправильное место, и ASP.NET выполняет какое-то кэширование? Буду рад любой помощи в поиске решения! Спасибо.


person Matt Hodgman    schedule 03.12.2020    source источник


Ответы (2)


С помощью этой строки вы открываете файловый поток и никогда его не закрываете.

model.Data.CopyTo(new FileStream(filePath, FileMode.Create));

Убедитесь, что вы всегда удаляете свои потоки, чтобы файлы не оставались заблокированными. Используйте код ниже, чтобы правильно скопировать поток в файл

using (var fs = new FileStream(filePath, FileMode.Create))
{
    model.Data.CopyTo(fs);
}
person Yegor Androsov    schedule 03.12.2020

Что произойдет, если вы поставите точку останова в функции DownloadData и выполните пошаговое выполнение? Успешно ли он читает файл в fileBytes или вы получаете исключение - какое исключение вы получаете? Также проверьте журналы IIS, чтобы получить код ошибки и опубликовать его, пожалуйста.

Кроме того, убедитесь, что пользователь, под которым вы работаете, имеет доступ на запись к папке. По умолчанию этого не будет.

Чтобы добавить, щелкните правой кнопкой мыши папку, безопасность и добавьте (с компьютера) IIS AppPool\ [независимо от имени appPool].

IIS AppPool\MyAppPool
person Dan Chase    schedule 03.12.2020
comment
При работе на локальном хосте, пока файл загружается, я получаю эти два исключения: ReadTimeout 'dataStream.ReadTimeout' выдал исключение типа "System.InvalidOperationException" int {System.InvalidOperationException} WriteTimeout 'dataStream.WriteTimeout' выдал исключение типа 'System.InvalidOperationException' int {System.InvalidOperationException} При попытке загрузки с развернутого в реальном времени сайта в Интернете появляется стандартная страница ошибки ядра asp.net, а в журналах IIS отображается ошибка 443, а затем ошибка 500... если я Читаю их правильно. пул приложений имеет разрешения да. - person Matt Hodgman; 03.12.2020
comment
Журнал, который я настроил для сайта, показывает это исключение, когда я пытаюсь загрузить с живого сайта: System.IO.IOException: Процесс не может получить доступ к файлу «C:\inetpub\wwwroot\wwwroot\images\2538e1f9-6e45-4816 -9eb1-3693afb226bd_example.pdf», потому что он используется другим процессом - person Matt Hodgman; 03.12.2020
comment
Отличная работа! Похоже, результаты вашего журнала согласуются с принятым ответом выше. Всегда ищите больше журналов и больше подробностей всякий раз, когда вы сталкиваетесь с проблемой. - person Dan Chase; 04.12.2020