2011-03-22 83 views
3

我寫了一段.NET代碼,它需要覆蓋託管在IIS 6或7上的網站中的圖像文件。應該觸摸圖像的唯一過程是IIS和我的過程,它會覆蓋圖像。在服務期間IIS 6/7是否鎖定圖像文件?

我想知道IIS是否會鎖定文件,導致我的覆蓋代碼拋出異常。

+0

你知道你可以這樣做嗎? '',並在響應中設置MIME類型等.... – 2011-04-01 09:29:29

+0

你是如何寫圖像? GDI +? – Brook 2011-04-01 13:08:11

回答

2

這是可能的,因爲雖然任何文件被讀出時,在讀期間被鎖定,所以你可能會遇到在那裏IIS是閱讀和提供文件的情況,而你試圖寫入文件與此同時。

This and this可以提供一些幫助等待文件,然後鎖定它。請記住,您可能會導致IIS響應速度慢,因爲它也等待文件。

0

IIS將鎖定文件。

如何編寫圖像一個HttpHandler,使您擁有在圖像上的投放方式,並從那裏直接控制。

既然你那麼控制圖像的投放和圖像的方式代替,所有你需要設計是一種常見的鎖定機制,以維持秩序。

5

簡短的回答將嘗試打開文件,如果失敗,等待幾秒鐘,然後再試,循環直到成功或超時。

但是,如果要更新這些圖片很多,你真的在​​這裏擊敗了IIS的緩存機制。 Web服務器提供不斷變化的文件是不健康的。 Web服務器在提供靜態文件方面非常出色。

現在,如果你的圖片是如此的動態,也許你需要通過服務器端程序來服務它來代替。生成您的圖像(或通過遠程或WCF從另一個程序中讀取它)並提供。你的服務器端程序也可能做某種形式的緩存。如果只持續很短的時間,甚至不需要保存圖像文件。

如果您只需偶爾更換這些圖像,則可以繼續重試。

現在,如果這些圖像真的很重要,並且您確實希望IIS在您有新版本後立即停止提供舊版本(您是否提供CAPTCHA?),並且IIS正在爲此文件提供許多許多那麼您的流程可能無法找到插槽。那麼您需要找到一種方法告訴IIS停止並等待新版本 - 重新啓動它應該可以工作,因爲您沒有更改圖像往往(否則,你會走動的路線)。

3

即使當它讀取IIS可以鎖定文件,你也許可以重命名文件的方式進行,並用新的版本來替換它。這個策略也可以用來擊敗'半文件'問題,即在文件完全寫入之前開始讀取文件。

  1. 與臨時文件名創建替換文件
  2. 重命名現有文件的方式進行
  3. 重命名替換文件到它的地方(新工藝拿起)
  4. 刪除舊文件時​​鎖清除
0

通過服務手段,我假設它讀取文件並交付給客戶端(瀏覽器)。對於這種操作,根本不需要鎖定文件。所以我們可以假定它正在以讀模式打開文件。 IIS使用TransmitFile()API通過套接字發送文件。它使用OS內部緩存來提高性能,並且不應該鎖定文件。

我們可以使用sysinternals中的processexplorer查看哪個文件被哪個進程打開。這將幫助您查找其實際是否被其他進程打開。