ASP.NET MVC 2: "процесс не может получить доступ к файлу, потому что он используется другим процессом."
Я пытаюсь использовать Controller.File
, чтобы вернуть FilePathResult
из представления в моем ASP.NET проект MVC 2. Я использую его так:
return File(pdfFilePath, "application/pdf", "foo.pdf");
Однако я продолжаю получать эту ошибку в желтом экране смерти:
Процесс не может получить доступ к файлу [путь к файлу], поскольку он используется другим процессом.
Эта ошибка обычно возникает, когда вы забываете закрыть файловый поток, но я решил, что об этом следует позаботиться ASP.NET фреймворк MVC. Это не происходит каждый время, но скорее периодически. Иногда я получаю файл просто отлично, но потом он просто перестает работать. Я использую сервер разработки при тестировании этого.
Есть идеи?
4 ответа:
Вы обращаетесь к файлу до строки кода, которую вы предоставили? Если да, то как вы получаете к нему доступ?
При обращении к файлам старайтесь использовать следующее, Чтобы избежать конфликтов потоков файлов:
File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Последнее перечисление
FileShare.ReadWrite
позволит другим потокам файлов читать и записывать в файл, даже если он открыт. Конечно, лучше не забыть закрыть свой поток как можно скорее.
Файл уже открыт, когда вы получаете это сообщение?
Если вы сделаете это, возможно, Adobe заблокирует файл.
Наиболее вероятным сценарием является то, что нечто иное, чем ASP.NET / IIS имеет открытый файл. Вы гарантировали, что никакие другие процессы не имеют блокировки на файл, когда возникает эта ошибка?
Если у вас есть доступ к серверу, когда происходит ошибка, вы можете использовать инструмент, такой как Process Explorer, чтобы посмотреть, что именно блокирует файл.
Блокировка может происходить изнутри asp.net сам - то как asp.net показывает гибкость потока, и как таковой это может быть другая нить изнутри asp.net threadpool завершает запрос. Вот почему вы видите эту проблему только периодически. Ответ бадди-это в основном решение вашей проблемы. Кроме того, при использовании ресурсов, содержащих состояние, объявленное как threadstatic, могут возникнуть и другие проблемы. Если это так, вы можете посмотреть на использование CallContext.