Google

2009年3月5日 星期四

ASP.Net 2.0 Directory.Delet() 造成 Session 遺失

在一個專案中需要用的檔案管理的機制,所以就去找了一個 ASP.net 的檔案管理程式,只用了
一支程式就做到了類似檔案總管的功能 ,實在很厲害,當然英文版的所以自己動手改成了
中文版的,介面也改簡單一些,一些沒用到的功能也把他省略掉或隱藏起來。
原版本請參考
http://www.binaryintellect.net/articles/44b73e89-78d9-4ad7-8157-bce54ad31fde.aspx

本來很高興的,找到一個不錯的工具。結果在測試的時候,出現一個嚴重的問題,
當在刪除目錄的時候,會發生 session 被清除的問題,導致身分的認證造成錯誤
原本是以為程式的問題,看了很久都沒發現程式的問題,最後還是求助 google,
終於發現,原來是 ASP.net 的機制問題,ASP.net 與 ASP 有一個很大的不同,就是
ASP.net 會先 compiler 之後,用 編譯過的碼來執行,與 ASP 一邊編譯一邊執行不一樣,
問題來了,ASP.net 甚麼時候會編譯呢? 沒錯,當檔案發生異動的時候會編譯,且
會重新執行,這樣就會造成 session 遺失,這樣說明應該很容易懂吧! 就這樣也發現了問題
在哪裡了,也在網路上發現了幾個方法!
一開始大家都會先想到,可以不可以讓 web server 不要監控 某一個目錄導致重新啟動就好了,就目前而言是否定的(也許我沒有找到吧!)。但是還是有其他的方法喔!

1. 將 session 由 memory mode 改為 Disk mode , 意思就是說 原本 session 應該是存在 記憶體裡面的,所以重新執行的時候會重新設定為空值,所以,如果改由 硬碟空間儲存,這樣子重新啟動的時候,就不會遺失session

2. 把要異動的目錄 放在 website 的目錄之外,講得很簡單,可不是用 IIS 的虛擬目錄喔!
因為虛擬目錄還是算在 website 的目錄之內,好在 NTFS 檔案結構有提供連接點的機制,
就跟 linux 的 mount 是類似的機制,可以用這種方法來 避開這個問題,所使用的是
linkd.exe 這個外部指令,在Windows Server 2003 Resource Kit Tools 中 有提供,
下載點 :
http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en
參考資料
http://www.binaryintellect.net/articles/44b73e89-78d9-4ad7-8157-bce54ad31fde.aspx
linkd.exe 指令 可以用 google 查詢一下 可以找到用法。

事實上微軟有提供一個方式,必須修改 register ,不過我沒有用這個方法,我用了 linkd.exe 指令來 連結另一個 目錄 到 website 的目錄下,就解決了我的問題了。

沒有留言: