我寫了一段.NET代碼,它需要覆蓋託管在IIS 6或7上的網站中的圖像文件。應該觸摸圖像的唯一過程是IIS和我的過程,它會覆蓋圖像。在服務期間IIS 6/7是否鎖定圖像文件?
我想知道IIS是否會鎖定文件,導致我的覆蓋代碼拋出異常。
我寫了一段.NET代碼,它需要覆蓋託管在IIS 6或7上的網站中的圖像文件。應該觸摸圖像的唯一過程是IIS和我的過程,它會覆蓋圖像。在服務期間IIS 6/7是否鎖定圖像文件?
我想知道IIS是否會鎖定文件,導致我的覆蓋代碼拋出異常。
IIS將鎖定文件。
如何編寫圖像一個HttpHandler,使您擁有在圖像上的投放方式,並從那裏直接控制。
既然你那麼控制圖像的投放和圖像的方式代替,所有你需要設計是一種常見的鎖定機制,以維持秩序。
簡短的回答將嘗試打開文件,如果失敗,等待幾秒鐘,然後再試,循環直到成功或超時。
但是,如果要更新這些圖片很多,你真的在這裏擊敗了IIS的緩存機制。 Web服務器提供不斷變化的文件是不健康的。 Web服務器在提供靜態文件方面非常出色。
現在,如果你的圖片是如此的動態,也許你需要通過服務器端程序來服務它來代替。生成您的圖像(或通過遠程或WCF從另一個程序中讀取它)並提供。你的服務器端程序也可能做某種形式的緩存。如果只持續很短的時間,甚至不需要保存圖像文件。
如果您只需偶爾更換這些圖像,則可以繼續重試。
現在,如果這些圖像真的很重要,並且您確實希望IIS在您有新版本後立即停止提供舊版本(您是否提供CAPTCHA?),並且IIS正在爲此文件提供許多許多那麼您的流程可能無法找到插槽。那麼您需要找到一種方法告訴IIS停止並等待新版本 - 重新啓動它應該可以工作,因爲您沒有更改圖像往往(否則,你會走動的路線)。
即使當它讀取IIS可以鎖定文件,你也許可以重命名文件的方式進行,並用新的版本來替換它。這個策略也可以用來擊敗'半文件'問題,即在文件完全寫入之前開始讀取文件。
通過服務手段,我假設它讀取文件並交付給客戶端(瀏覽器)。對於這種操作,根本不需要鎖定文件。所以我們可以假定它正在以讀模式打開文件。 IIS使用TransmitFile()API通過套接字發送文件。它使用OS內部緩存來提高性能,並且不應該鎖定文件。
我們可以使用sysinternals中的processexplorer查看哪個文件被哪個進程打開。這將幫助您查找其實際是否被其他進程打開。
你知道你可以這樣做嗎? '',並在響應中設置MIME類型等.... – 2011-04-01 09:29:29
你是如何寫圖像? GDI +? – Brook 2011-04-01 13:08:11