Podczas naszych kompilacji produkcyjnych bardzo duży (10 megabajtów) plik zawartości statycznej w katalogu głównym jest czasami blokowany przez IIS i nie może zostać usunięty przez czyste zadanie. Jest tak prawdopodobnie dlatego, że w tym czasie jest on aktywnie obsługiwany przez jednego lub więcej klientów.
Proces kompilacji zatrzymuje witrynę przed czyszczeniem
c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com
Jednak to nie zwolnić pliku - trzeba ponownie uruchomić usługi IIS, aby proces zrezygnować z jego blokadę.
appcmd.exe
pozwala całkowicie zdjąć IIS; my nie chcemy tego robić!
Czy istnieją inne sposoby zmuszenia IIS do zwolnienia zablokowanego pliku bez ponownego uruchamiania IIS? Samo zatrzymanie i uruchomienie pojedynczej witryny zdecydowanie nie działa, aby zwolnić blokadę pliku.
Odpowiedzi:
Istnieją narzędzia, takie jak Sysinternal's Process Explorer, które mogą wyszukiwać i wymuszać zamykanie uchwytów plików, jednak stan i zachowanie aplikacji (zarówno twojej, jak i, w tym przypadku IIS) po wykonaniu tej czynności jest nieokreślone. Niektórym to nie obchodzi, niektórzy będą błądzić, a inni mocno się rozbiją.
Prawidłowym rozwiązaniem jest wyeliminowanie awarii i umożliwienie IIS czystego zwolnienia blokad i czyszczenia po sobie, aby zachować stabilność serwera. Jeśli nie jest to możliwe, możesz utworzyć inną witrynę w tym samym pudełku lub skonfigurować nowe pudełko z nową zawartością i przenieść nazwę domeny / adres IP, aby „promować” nową zawartość do produkcji.
źródło
Używam do tego małego narzędzia o nazwie „Uchwyt” .
Zasadniczo przekazujesz mu nazwę pliku, który jest zablokowany, i informuje, jakie procesy go wykorzystują:
Następnie podajesz przełącznik -c, aby zamknąć uchwyt:
Możesz mieć problem z włączeniem tego do skryptu kompilacji bez programu opakowującego, aby przeanalizować dane wyjściowe, ale mam nadzieję, że to pomoże.
źródło
Nie jestem pewien, czy masz na myśli kompilację plików aspx w zespołach tymczasowych. Korzystamy z projektów wdrażania ASP.NET , które wstępnie kompilują wszystkie pliki aspx / ascx.
Podczas kopiowania plików binarnych z folderu „publikuj” do folderu „bin” tymczasowo włączamy plik app_offline.htm, który jest usuwany po skopiowaniu wszystkich zestawów (zaledwie kilka sekund). W ten sposób nigdy nie doświadczyłem blokady plików.
EDYTOWAĆ:
Możesz spróbować odtworzyć pulę aplikacji za pomocą appcmd.exe, zamiast zatrzymywania strony internetowej:
źródło
Próbuję tego teraz: Najwyraźniej mogą występować problemy z blokowaniem plików, jeśli masz włączone indeksowanie w katalogu. http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html
Jest to IIS 6.0, ale ponieważ wydaje się, że jest to związane z systemem operacyjnym, a nie z IIS, może to być podstawowa przyczyna.
źródło
Process Monitor powinien pomóc w dochodzeniu, oto przykład z blogu Marka ( na faceta, który napisał Tool), jak znaleźć uchwyt pliku.
Możesz wypróbować to narzędzie Unlocker, aby zautomatyzować odblokowywanie na poziomie uchwytu pliku.
źródło
Nie odpowiedź, ale sposób obejścia tego problemu w przypadku, gdy nie ma możliwości „odblokowania” tego pliku bez ponownego uruchomienia serwera IIS:
Co się stanie, jeśli zbudujesz / wdrożysz w nowym pustym folderze i zmienisz katalog domowy strony internetowej na ten folder? Musisz jednak utworzyć nową nazwę folderu lub przełączać się między dwiema nazwami.
Nie wiem, do którego folderu należy ten plik. Jeśli nie musi znajdować się w folderze głównym, możesz umieścić go w nowo utworzonym folderze i utworzyć katalog wirtualny wskazujący ten folder. Możesz więc zachować standardowy katalog domowy dla aplikacji.
źródło
Miałem ten sam problem. Teraz przełączyłem się na MSDeploy (Web Deploy) , a teraz mogę w niezawodny sposób aktualizować witrynę bez zatrzymywania czegokolwiek. W rzeczywistości ten krok jest zapisany w skrypcie w naszym narzędziu do automatycznej kompilacji i odbywa się cały czas bez żadnych problemów. I to też jest szybkie.
źródło
Jasne, zatrzymaj usługę IIS. Może nie rozumiem czegoś, przepraszam.
źródło
Uwaga: nie jest ekspertem od semantyki blokowania plików systemu Windows
Jarrod, czy możesz zmienić nazwę pliku na uboczu? Możesz także utworzyć nowy plik z tymczasowym rozszerzeniem, a następnie zmienić jego nazwę na bieżący plik.
Jeśli semantyka blokowania plików systemu Windows działa podobnie do POSIX, czytniki, które posiadają bieżącą blokadę odczytu pliku, powinny nadal obsługiwać stary plik, dopóki nie zamkną swoich strumieni odczytu, a nowe czytniki otworzą nowy plik.
źródło