2010-07-11 111 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