Во время наших производственных сборок очень большой (10 мегабайт) файл статического содержимого в корневом каталоге иногда блокируется IIS и не может быть удален задачей очистки. Вероятно, это связано с тем, что в данный момент он активно обслуживается одним или несколькими клиентами.
В процессе сборки сайт останавливается перед очисткой через
c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com
Однако это не освободить файл - мы должны перезапустить IIS, чтобы процесс снял блокировку.
appcmd.exe
позволяет полностью отключить IIS; мы не хочу это сделать!
Есть ли другие способы заставить IIS отпустить заблокированный файл без перезапуска IIS? Простая остановка и запуск отдельного веб-сайта определенно не помогает снять блокировку файла.
Я использую небольшой инструмент под названием "Ручка" сделать это.
Вы в основном передаете ему имя заблокированного файла, и он сообщает вам, какие процессы его используют:
handle c:\weird.file
Something.exe pid: 1000 100: C:\weird.file
Something.exe pid: 1000 101: C:\weird.file
Затем вы передаете ему переключатель -c, чтобы он закрыл дескриптор:
handle.exe -c 101 -p 1000 -y
handle.exe -c 100 -p 1000 -y
Возможно, вам будет сложно реализовать это в сценарии сборки без программы-оболочки для анализа вывода, но, надеюсь, это поможет.
Существуют инструменты, такие как Process Explorer Sysinternal, которые могут найти и принудительно закрыть дескрипторы файлов, однако состояние и поведение приложения (как вашего, так и, в данном случае, IIS) после этого не определены. Некоторым все равно, некоторые будут ошибаться, а другие сильно упадут.
Правильное решение - устранить сбой и позволить IIS снять блокировки и очистить после себя, чтобы сохранить стабильность сервера. Если это невозможно, вы можете либо создать другой сайт в том же ящике, либо настроить новый ящик с новым контентом и переместить доменное имя / IP-адрес, чтобы «продвигать» новый контент в производство.
Не уверен, имеете ли вы в виду компиляцию aspx файлов во временные сборки. Мы используем Проекты развертывания ASP.NET, которые предварительно компилируют все файлы aspx / ascx.
При копировании двоичных файлов из папки «publish» в папку «bin» мы временно включаем файл app_offline.htm, который удаляется после копирования всех сборок (всего за несколько секунд). Таким образом, я никогда не сталкивался с блокировками файлов.
РЕДАКТИРОВАТЬ:
Вы можете попробовать переработать пул приложений с помощью appcmd.exe вместо остановки веб-сайта:
C:\Windows\System32\inetsrv\appcmd.exe recycle apppool "My App Pool Name"
Я пробую это сейчас: по-видимому, могут возникнуть проблемы с блокировкой файлов, если у вас активировано индексирование в каталоге. http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html
Это IIS 6.0, но поскольку это, похоже, связано с ОС, а не с IIS, это может быть основной причиной.
Монитор процесса должен помочь вам в расследовании, вот пример из блога Марка (то парень, который написал инструмент) о том, как найти дескриптор файла.
Вы можете попробовать это Инструмент разблокировки для автоматизации разблокировки на уровне дескриптора файла.
Не ответ, а вариант обхода на случай, если нет возможности «разблокировать» этот файл без перезапуска сервера IIS:
Что если вы создадите / развернете в новой пустой папке и измените домашний каталог веб-сайта на эту папку? Вы должны создать новое имя папки или переключаться между двумя именами.
Я не знаю, в какой папке находится этот файл. Если он не обязательно должен находиться в корневой папке, вы можете поместить его во вновь созданную папку и создать виртуальный каталог, указывающий на эту папку. Таким образом, вы можете сохранить свой стандартный домашний каталог для приложения.
У меня такая же проблема. Теперь я перешел на MSDeploy (веб-развертывание), и теперь я могу надежно обновлять веб-сайт, ничего не останавливая. Фактически, этот шаг прописан в нашем автоматическом инструменте сборки и происходит все время без каких-либо проблем. И это тоже быстро.
Конечно, остановите службу IIS. Может я чего-то не понимаю, извините.
нота: не эксперт по семантике блокировки файлов Windows
Джаррод, ты можешь переименовать файл в сторону. Вы также можете создать новый файл с временным расширением, а затем переименовать его поверх текущего файла.
Если семантика блокировки файлов Windows работает аналогично POSIX, считыватели, которые удерживают текущую блокировку чтения файла, должны продолжать обслуживать старый файл, пока они не закроют свои потоки чтения, в то время как новые считыватели откроют новый файл.