【问题标题】:ASP.Net session start and end issueASP.Net 会话开始和结束问题
【发布时间】:2010-07-11 15:56:05
【问题描述】:

我正在使用 ASP.Net + .Net 3.5 + VSTS 2008 + IIS 7.0 + C# 来开发 Web 应用程序。我正在创建一个非常简单的 Web 应用程序,并且我只是修改了 page_load、Session_Start 和 Session_End。这是我的代码,我的问题是我发现会话结束消息在会话开始消息后立即写入文件。我的测试方法就是打开IE访问这个页面。我认为会话应该持续很长时间,比如几分钟。为什么会话结束这么快?为什么即使我不关闭页面,浏览也会结束?

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.");
    }
}

即使将 Session 操作代码添加到 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.

提前致谢, 乔治

【问题讨论】:

标签: c# asp.net .net iis visual-studio-2008


【解决方案1】:

如果我没记错的话,你实际上需要为 Session 分配一些东西来激活它。否则 ASP.NET 每次都会重新生成一个新会话(如果您使用 fiddler 检查,则为新会话 id)。

编辑:因为 session.txt 位于 bin 目录中。写入 bin 目录后,应用程序将重新启动,因此 Session_End 事件立即触发。将 session.txt 从 bin 目录移到其他地方将解决您的问题。

【讨论】:

  • "你需要实际分配一些东西给 Session 来激活它。" -- 你能告诉我怎么做吗?
  • 我的意思是设置一个会话变量,例如会话[“用户数据”] =“用户数据”;。如果代码从不向会话中写入任何内容,则 ASP.NET 实际上不会保留会话。
  • 尝试再添加一行这样的 Session["UserData"] = "userdata";进入 Page_Load 事件,看看它现在是否适合你。
  • @George2,我知道为什么,因为 session.txt 位于 bin 目录中。写入 bin 目录后,应用程序将重新启动,因此 Session_End 事件立即触发。将 session.txt 从 bin 目录移到其他地方将解决您的问题。
  • 这种行为是设计使然,bin 目录在 ASP.NET 中是特殊的,它应该存储应用程序所需的程序集。原因在于 ASP.NET 如何监视 bin 目录以了解对其中的程序集所做的任何更改,然后重新启动应用程序以再次加载所有程序集。
【解决方案2】:

这种行为有时是由过分热心的防病毒程序引起的。尝试禁用防病毒软件,看看是否有帮助。如果有帮助,则将该站点的目录添加到排除列表中。

同样关闭浏览器也不会对您的会话产生任何影响。

【讨论】:

  • 您的意思是关闭浏览器并不意味着立即结束会话(意味着 Session_End 不会立即从服务器端调用)?为什么?
  • 会话结束仅在会话自身超时或通过调用 Session.Abandon() 强制结束时触发。通常,服务器不知道浏览器已关闭(除非您有一些复杂的 javascript 在浏览器关闭时调用服务器,而且这甚至在所有情况下都不起作用)。这就是为什么会话有一个超时,所以它不会永远存在。
  • 我理解您的回复,但它没有回复我的要求。 :-) 我在问为什么在我的示例中的 Session Start 之后立即调用 Session End?
  • 对于您的问题“为什么在我的示例中会话开始后立即调用会话结束”我的回答是它可能是防病毒软件。
猜你喜欢
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多