会话Session

  • Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端)。客户端与服务器端就是通过这个key来确认客户端的身份,通常这个key为SessionID。
  • 一般情况下,SessionID以Cookie的形式保存在浏览器中,在不使用Cookie的情况下,也可以将这个SessionID嵌入到访问网页的URL中。

服务器端Session

在页面对象或者HttpContext对象中,都有一个名为Session的属性,在一次会话中,它们引用的都是同一个对象。

public HttpSessionState Session { get; }

Session对象是HttpSessionState类的实例。Session是保存在服务器端的,对每个登录到网站的用户都有一份,是独有的,而其他用户无法共享。


那么问题来了,来看看奇怪的阻塞。

我们来看一个一需求: 需要实时的将服务器的运行状态输出到当前登陆的客户端,建立长连接并且作实时输出。 然后就有了下面这个Action。

Boolean isOnline = true;
 
 public ActionResult Index()
 {
            #region 滚动条控制

            Response.Write("<html onclick=\"clearInterval(i_1);\" ondblclick =\"reInterval()\"><head><title>服务器实时监控</title></head>");
            Response.Write("<script type=\"text/javascript\">");
            Response.Write("function scrollWindow() { document.body.scrollTop = document.body.scrollHeight; }");
            Response.Write("function reInterval() { i_1 = setInterval('scrollWindow()', 50); }");
            Response.Write("i_1 = setInterval('scrollWindow()', 50);");
            Response.Write("scrollWindow();");
            Response.Write("</script> ");
            Response.Flush();

            #endregion
            
            Dictionary<int, string> dicColor = new Dictionary<int, string>() 
            {
                {0,"#0000FF"},          // 蓝色
                {1,"#FF3333"},          // 红色
                {2,"#FFFF00"},          // 黄色
                {3,"#FF3EFF"},
                {4,"#0000FF"},
                {5,"#0000FF"}
            };
            DebugCallback callback = new DebugCallback(delegate(int type, string str)
            {
                if (dicColor.ContainsKey(type))
                {
                    Response.Write("<span style = 'color:" + dicColor[type] + ";'>" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "--" + str + "</span>  <br />");
                }
                Response.Flush();
            });

            Log.AddCallBack(callback);

            while (isOnline)
            {
                try
                {
                    Response.Write("...<br>");
                    Response.Flush();
                }
                catch { }
                System.Threading.Thread.Sleep(1000);
                if (!Response.IsClientConnected)            // 连接关闭
                {
                    Log.RemoveCallBack(callback);
                    Response.Write("</html>");
                    break;
                }
            }
            return null;
        }
View Code

相关文章: