none
会话结束执行 ;看下我的代码》..... RRS feed

  • 问题

  • 我想让会话结束的时候    插入到数据库  却执行不了,下面是我的代码,是不是写错地方了:

     void Application_Start(object sender, EventArgs e) 
        {
            // 在应用程序启动时运行的代码
            SqlConnection conn = new SqlConnection("Data Source=AOLI-GYB\\GUOYANBIN;Initial Catalog=wlsq;User ID=sa;password=guoyanbin");
            conn.Open();
            SqlCommand cmd = new SqlCommand("select MaxData from MaxOnline_tab", conn);
            int count = Convert.ToInt32(cmd.ExecuteScalar());
            Application.Add("MaxOnline", count);
            Application["User"] = 0;
            //Application.Add("User", 0);
            conn.Close();
    
        }
        
    
       void Session_End(object sender, EventArgs e) 
        {
            // 在会话结束时运行的代码。 
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 
            // 或 SQLServer,则不会引发该事件。
            SqlConnection conn = new SqlConnection("Data Source=AOLI-GYB\\GUOYANBIN;Initial Catalog=wlsq;User ID=sa;password=guoyanbin");
            conn.Open();
            SqlCommand com = new SqlCommand("select MaxData from MaxOnline_tab", conn);
            SqlDataReader read = com.ExecuteReader();
            while (read.Read())
            {
                int Data = Convert.ToInt32(read["MaxData"].ToString());
                if ((int)Application["MaxOnline"] > Data)
                {
                    com.CommandText = "update MaxOnline_tab set MaxData=" + Application["MaxOnline"];
                    com.ExecuteNonQuery();
                }
            }
            conn.Close();
    
            Application.Lock();
            Application["MaxOnline"] = (int)Application["MaxOnline"] - 1;
            Application.UnLock();
    
        }
    数据库中还是没有数据.......
    小吴
    2009年4月25日 9:27

答案

  • Session_End 会有延迟,因为服务器端并不知道客户端是否已经关闭了浏览器,只能根据超过延迟时间未有浏览动作来判断他的SESSION已经END。默认时间好像是20分钟,  你可以在退出前调用 Session.Abandon() 
    知识改变命运,奋斗成就人生!
    2009年4月25日 9:39
    版主
  • 1,如果想验证是不是代码是否有问题。你可以将你上面的代码放在 Button_Click里执行一次看看是否正确就知道是否是代码的问题
    2,正如你注释里面写的,只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。其他设置不会发生此事件。
    3,session过期时间默认是20分钟,如果想立即测试过期,可以在代码里执行一次Session.Abandon();

    【孟子E章】
    2009年4月25日 10:47
    版主
  • 1,
    <sessionState mode="InProc" timeout="3"></sessionState>
    
    2,global.asax;里写
    
    <%@ Application Language="C#" %>
    <script RunAt="server">
      public static string appPath = ""; 
      void Session_Start(object sender, EventArgs e)
      {
        
      }
    
      void Session_End(object sender, EventArgs e)
      {
        string log = appPath + "\\log.txt";
        System.IO.StreamWriter sw = new System.IO.StreamWriter(log, true);
        sw.WriteLine("Session_end on " + System.DateTime.Now.ToString());
        sw.Close();
        sw.Dispose();
      }
    
    
      protected void Application_BeginRequest(object sender, EventArgs e)
      {
        if (appPath == "")
        appPath = HttpContext.Current.Server.MapPath("~/");
      }
    </script>
    
    
    3,然后编译网站-发布网站到iis下,在iis里将你的网站设置可写入,物理文件夹设置匿名帐户可修改权限,注意:不同版本的iis匿名帐号是不同的,这个你必须十分清楚
    
    4,随便访问一个页面,关闭。3分钟后到网站的根目录下看log.txt的内容

    【孟子E章】
    2009年4月30日 7:13
    版主

全部回复

  • Session_End 会有延迟,因为服务器端并不知道客户端是否已经关闭了浏览器,只能根据超过延迟时间未有浏览动作来判断他的SESSION已经END。默认时间好像是20分钟,  你可以在退出前调用 Session.Abandon() 
    知识改变命运,奋斗成就人生!
    2009年4月25日 9:39
    版主
  • 1,如果想验证是不是代码是否有问题。你可以将你上面的代码放在 Button_Click里执行一次看看是否正确就知道是否是代码的问题
    2,正如你注释里面写的,只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。其他设置不会发生此事件。
    3,session过期时间默认是20分钟,如果想立即测试过期,可以在代码里执行一次Session.Abandon();

    【孟子E章】
    2009年4月25日 10:47
    版主
  • 正如你所说,只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 或 SQLServer,则不会引发该事件。需要解决这个问题,你需要根据你的需求和使用场景,换一个思路去设计这个功能了。这个问题技术点无法解决,需要从设计上去解决。
    jon.valett@gmail.com
    2009年4月26日 9:09
    版主
  •  void Session_End(object sender, EventArgs e)
        {
         }
    这里面的代码在会话结束时还是不执行, 我就是想在结束时记录最高的访问人数到数据库中,换什么思路呢》郁闷...........实现这样的功能有其他方法吗?各位?
    小吴
    2009年4月30日 1:07
  • 完全可以用 Session_Start
    知识改变命运,奋斗成就人生!
    2009年4月30日 1:09
    版主
  • 1,
    <sessionState mode="InProc" timeout="3"></sessionState>
    
    2,global.asax;里写
    
    <%@ Application Language="C#" %>
    <script RunAt="server">
      public static string appPath = ""; 
      void Session_Start(object sender, EventArgs e)
      {
        
      }
    
      void Session_End(object sender, EventArgs e)
      {
        string log = appPath + "\\log.txt";
        System.IO.StreamWriter sw = new System.IO.StreamWriter(log, true);
        sw.WriteLine("Session_end on " + System.DateTime.Now.ToString());
        sw.Close();
        sw.Dispose();
      }
    
    
      protected void Application_BeginRequest(object sender, EventArgs e)
      {
        if (appPath == "")
        appPath = HttpContext.Current.Server.MapPath("~/");
      }
    </script>
    
    
    3,然后编译网站-发布网站到iis下,在iis里将你的网站设置可写入,物理文件夹设置匿名帐户可修改权限,注意:不同版本的iis匿名帐号是不同的,这个你必须十分清楚
    
    4,随便访问一个页面,关闭。3分钟后到网站的根目录下看log.txt的内容

    【孟子E章】
    2009年4月30日 7:13
    版主
  • 其实MaxData也可以放变量里面,只有满足条件了采取操作数据库
    【孟子E章】
    2009年4月30日 7:29
    版主