ASP.NET MVC 2: «Процесс не может получить доступ к файлу <filename>, поскольку он используется другим процессом». - PullRequest
2 голосов
/ 26 августа 2010

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

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

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

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

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

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 26 августа 2010

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

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

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

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

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

0 голосов
/ 26 августа 2010

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

0 голосов
/ 26 августа 2010

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

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

0 голосов
/ 26 августа 2010

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

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

...