Page.cs
1 DateTime lastWriteTime=DateTime.Now;
2 //檢查是否存在
3 bool isExists=wfs.Exists() && DateTime.Now.Subtract(lastWriteTime=wfs.GetLastWriteTime()).TotalDays <= fileKeepDays;
4 lastWriteTime = isExists ? lastWriteTime : DateTime.Now;
5 //設置緩存
6 Response.Cache.SetExpires(lastWriteTime.AddDays(fileKeepDays));
7 Response.Cache.SetLastModifIEd(lastWriteTime.AddMinutes(-1));
8 Response.ContentType = "text/Html";
9 if (!isExists)
10 {
11 try
12 {
13 writer = wfs.GetWriter();
14 //在這裡將頁面內容填寫進去,我一般都是用XSLT來輸出頁面
15 }
16 finally
17 {
18 if (writer != null)
19 {
20 writer.Close();
21 }
22 wfs.Dispose();
23 }
24 }
25 wfs.ResponseFile();
26 wfs.Dispose();
有必要的話再耐心看看我在Web.Config裡面是怎樣配置使用WFS的:
Web.Config
1 <Handler pattern="^/place/cn/((?:[^$/]+/){3})([^$]+).ASPx" handlerType="FFS" useGzip="true" savePath="/place/cn/$1FFS.resx" saveName="$2"/>
2 <Handler pattern="^/place/cn/([^$]+).aspx" handlerType="OS" useGzip="true" savePath="/place/cn/$1.ASPx"/>
以上的配置是為我的地名信息系統設計的,大體意思是:對於前三級行政區劃(省、市、縣),因為訪問次數比較多,考慮到性能,將緩存直接輸出到系統對應的文件,對於後面的所有行政區劃按所在縣的名稱分文件按照結構化存儲。
最後,說說BlueDog的C#類庫的BUG吧,其實說起來很簡單,他可能沒有注意到EnumElements方法產生獲取的ComTypes.STATSTG對象也必須由COM來銷毀,否則,對應的文件操作句柄就沒有被釋放,下次打開文件就會出錯(這個問題折磨了我好久!),受到影響的至少有以下兩個方法(其他方法因為我沒有使用,因此,不知道還有沒有),這兩個方法應該更改為如下:
Strorage.cs Bug Fix
1 public bool IsElementExist(string elementName)
2 {
3 ArgumentValidation.CheckForEmptyString(elementName, "elementName");
4
5 IEnumSTATSTG statstg;
6 ComTypes.STATSTG stat;
7 uint k;
8 this.storage.EnumElements(0, IntPtr.Zero, 0, out statstg);
9 statstg.Reset();
10 bool found = false;
11 while (statstg.Next(1, out stat, out k) == HRESULT.S_OK)
12 {
13 //忽略大小寫比較
14 if (string.Compare(stat.pwcsName, elementName, true) == 0)
15 {
16 found = true;
17 break;
18 }
19 }
20 Marshal.ReleaseComObject(statstg);//釋放statstg
21 return found;
22 }
23 public List<StgElementInfo> GetChildElementsInfo()
24 {
25 IEnumSTATSTG statstg;
26 ComTypes.STATSTG stat;
27 uint k;
28 List<StgElementInfo> list = new List<StgElementInfo>();
29 this.storage.EnumElements(0, IntPtr.Zero, 0,out statstg);
30 statstg.Reset();
31 while (statstg.Next(1, out stat, out k) == HRESULT.S_OK)
32 {
33 list.Add(new StgElementInfo(stat));
34 }
35 Marshal.ReleaseComObject(statstg);//釋放statstg
36 return list;
37 }