2010-07-11 108 views
4

我使用ASP.Net + .Net 3.5 + VSTS 2008 + IIS 7.0 + C#開發Web應用程序。我正在創建一個非常簡單的Web應用程序,並且我只是修改了page_load,Session_Start和Session_End。這裏是我的代碼,我的問題是我發現會話開始消息後會話結束消息立即寫入文件。我的測試方法只是打開IE訪問此頁面。我認爲會議應該持續很長時間,就像幾分鐘。爲什麼會話如此快速結束?即使我沒有關閉該頁面,爲什麼還是會結束?ASP.Net會話開始和結束問題

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("Hello World! "); 
    Session["SomeUserData"] = DateTime.Now; 
} 

protected void Session_Start(object sender, EventArgs e) 
{ 
    using (TextWriter tw = new StreamWriter(@"C:\TestSession\bin\session.txt", true)) 
    { 
     // write a line of text to the file 
     tw.WriteLine(DateTime.Now + " Session Started."); 
    } 
} 

protected void Session_End(object sender, EventArgs e) 
{ 
    using (TextWriter tw = new StreamWriter(@"C:\TestSession\bin\session.txt", true)) 
    { 
     // write a line of text to the file 
     tw.WriteLine(DateTime.Now + " Session Ended."); 
    } 
} 

我見了即使添加會話操作代碼到Page_Load方法同樣的問題,這裏是輸出文件的內容,你可以看到會話結束事件會話開始後立即調用。

2010/7/15 0:11:14 Session Started. 
2010/7/15 0:11:14 Session Ended. 
2010/7/15 0:11:28 Session Started. 
2010/7/15 0:11:28 Session Ended. 

由於事先 喬治

+1

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatemodule.end.aspx – 2010-07-11 17:32:46

+0

你想從這個鏈接證明什麼? – George2 2010-07-12 18:26:49

回答

8

如果我沒有記錯的話,你需要實際分配一些東西到Session來激活它。否則,ASP.NET將每次都重新生成一個新會話(如果您使用fiddler檢查,則爲新會話ID)。

編輯:因爲session.txt位於bin目錄內。一旦寫入bin目錄,應用程序將重新啓動,以便立即觸發Session_End事件。將session.txt移出bin目錄到其他地方可以解決你的問題。

+0

「您需要實際分配會話才能激活它。」 - 你能告訴我怎麼樣? – George2 2010-07-12 18:25:16

+1

我的意思是設置一個會話變量,例如Session [「UserData」] =「userdata」;.如果代碼從不在會話中寫入任何內容,ASP.NET實際上不會保留會話。 – airmanx86 2010-07-12 23:08:24

+1

嘗試再添加一行,像這樣Session [「UserData」] =「userdata」;進入Page_Load事件,看看它現在是否適合你。 – airmanx86 2010-07-12 23:10:31

2

這種行爲有時是由一個過分熱心的反病毒程序引起的。嘗試禁用防病毒並查看是否有幫助。如果有幫助,則將網站的目錄添加到排除列表中。

同樣關閉瀏覽器對您的會話沒有任何影響。

+0

你的意思是關閉瀏覽器並不意味着立即結束會話(意味着Session_End不立即從服務器端調用)?爲什麼? – George2 2010-07-12 18:25:58

+1

僅當會話超時或通過調用Session.Abandon()強制結束時纔會觸發會話結束。 通常,服務器不知道瀏覽器是關閉的(除非在瀏覽器關閉時有一些複雜的JavaScript來調用服務器,甚至在所有情況下都不適用)。這就是會話有超時的原因,所以它不會永遠活着。 – 2010-07-13 13:02:14

+0

我理解你的回覆,但它不回覆我所問的內容。 :-) 我在問爲什麼會話開始後我的示例中立即調用會話結束? – George2 2010-07-14 16:08:36