在页面对象或者HttpContext对象中,都有一个名为Session的属性,在一次会话中,它们引用的都是同一个对象。javascript
public HttpSessionState Session { get; }
Session对象是HttpSessionState类的实例。Session是保存在服务器端的,对每一个登陆到网站的用户都有一份,是独有的,而其余用户没法共享。html
咱们来看一个一需求: 须要实时的将服务器的运行状态输出到当前登录的客户端,创建长链接而且做实时输出。 而后就有了下面这个Action。java
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; }
因为这个Action是一个长链接,它不会断开链接会一直处于请求的状态,这个时候当咱们再请求同一个Session的其它的Action的时候,发现全部其它的Action都会处于Waiting状态……好吧,明明是异步并发请求,为什么如今却成了“单线程”工做了呢?很明显有锁。浏览器
能够为本Controller增长如下特性,可是本Controller都不能修改Session了,只能读取服务器
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
在Web.config 文件里面添加并发
EnableSessionState="ReadOnly" // 仅仅加载那个阻塞页面