IIS хранит мои сгенерированные файлы - PullRequest
2 голосов
/ 16 сентября 2008

Мое веб-приложение генерирует PDF-файлы и отправляет их по электронной почте или по факсу нашим клиентам. Каким-то образом IIS6 хранит файл и блокирует любые другие запросы на него, утверждая, что он «..процесс не может получить доступ к файлу« xxx.pdf », поскольку он используется другим процессом».

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

Спасибо

Ответы [ 5 ]

6 голосов
/ 16 сентября 2008

Как и все говорили, вызывайте метод Close и Dispose для любых объектов ввода-вывода, которые вы открываете при чтении / записи файлов PDF.

Но я полагаю, вы включили сторонний компонент? , чтобы сделать PDF-запись для вас? Если это так, вы можете обратиться к поставщику и / или к его документации, чтобы убедиться, что вы делаете все так, как этого хотели поставщики. Не доверяйте черному ящику, который вы получили от кого-то другого, если он не зарекомендовал себя.

Еще одно место, на которое стоит обратить внимание, - это то, что происходит во время нескольких веб-запросов к файлам PDF. Вы уверены, что файл не записывается одновременно из нескольких мест? например 2-3 запроса на создание PDF одновременно? или 2-3 страницы в процессе создания PDF?

И, наконец, вы можете проверить журналы исключений, чтобы убедиться, что ничто не приводит к сбою / потоку, выходящему и оставляющему дескриптор файла открытым, без вашего ведома. Это часто случается в многопоточных сценариях, иногда поток просто падает и завершается - что может произойти, особенно если вы используете сторонние компоненты, они могут выполнять некоторые магические трюки, вы никогда не узнаете.

1 голос
/ 16 сентября 2008

Похоже, файлы - после создания - все еще заблокированы рабочим процессом. Убедитесь, что вы закрыли все соединения для вашего файла. (помните, об использовании блоков мы позаботимся об этом)

0 голосов
/ 16 сентября 2008
  1. Как упоминалось ранее: позаботьтесь о том, чтобы закрыть все открытые обработчики.

  2. Иногда служба индексации Microsoft блокирует файлы. Исключить ваш каталог

0 голосов
/ 16 сентября 2008

Убедитесь, что все файлы для записи кода на диске правильно закрывают каждый дескриптор с помощью правильного .Close () в предложении finally или через предложение «использование» в C #

byte[] asciiBytes = getPdf(...);
try{
BinaryWriter bw = new BinaryWriter(File.Create(filename));
bw.Write(pdfBytes);
}
finally {
  if(null != bw)
    bw.Close();
}

Используйте команду Response и Content-Disposition для отправки файла

Response.ContentType = "application/pdf";
Response.AppendHeader("Content-disposition", "attachment; filename=" + PDID + ".pdf");
Response.WriteFile(filename);
Response.Flush();

Показанный код создает и отправляет PDF-файлы клиенту в течение примерно 18 месяцев, и мы никогда не видели файл заблокированным.

0 голосов
/ 16 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...