ASP.NET MVC 2: "процесс не может получить доступ к файлу, потому что он используется другим процессом."


Я пытаюсь использовать Controller.File, чтобы вернуть FilePathResult из представления в моем ASP.NET проект MVC 2. Я использую его так:

return File(pdfFilePath, "application/pdf", "foo.pdf");

Однако я продолжаю получать эту ошибку в желтом экране смерти:

Процесс не может получить доступ к файлу [путь к файлу], поскольку он используется другим процессом.

Эта ошибка обычно возникает, когда вы забываете закрыть файловый поток, но я решил, что об этом следует позаботиться ASP.NET фреймворк MVC. Это не происходит каждый время, но скорее периодически. Иногда я получаю файл просто отлично, но потом он просто перестает работать. Я использую сервер разработки при тестировании этого.

Есть идеи?

4 2

4 ответа:

Вы обращаетесь к файлу до строки кода, которую вы предоставили? Если да, то как вы получаете к нему доступ?

При обращении к файлам старайтесь использовать следующее, Чтобы избежать конфликтов потоков файлов:

File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

Последнее перечисление FileShare.ReadWrite позволит другим потокам файлов читать и записывать в файл, даже если он открыт. Конечно, лучше не забыть закрыть свой поток как можно скорее.

Http://msdn.microsoft.com/en-us/library/y973b725.aspx

Файл уже открыт, когда вы получаете это сообщение?

Если вы сделаете это, возможно, Adobe заблокирует файл.

Наиболее вероятным сценарием является то, что нечто иное, чем ASP.NET / IIS имеет открытый файл. Вы гарантировали, что никакие другие процессы не имеют блокировки на файл, когда возникает эта ошибка?

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

Блокировка может происходить изнутри asp.net сам - то как asp.net показывает гибкость потока, и как таковой это может быть другая нить изнутри asp.net threadpool завершает запрос. Вот почему вы видите эту проблему только периодически. Ответ бадди-это в основном решение вашей проблемы. Кроме того, при использовании ресурсов, содержащих состояние, объявленное как threadstatic, могут возникнуть и другие проблемы. Если это так, вы можете посмотреть на использование CallContext.