asp.net/asp网站浏览器打开一个长时间运行的页面同时打开其他页面为什么被挂起
asp.net/asp网站,当浏览器打开一个长时间运行的页面,点击链接同时打开其他页面,会出现被挂起的现象,一直白屏在加载状态,就如卡死一样。
出现这个问题是由于长时间运行的页面使用了session,而同一个浏览器打开的同网站其他页面sessionid是一样的,共用session,asp.net/asp给session加锁,其他的请求会被挂起。
并发请求和会话状态
对 ASP.NET 会话状态的访问专属于每个会话,这意味着如果两个不同的用户同时发送请求,则会同时授予对每个单独会话的访问。 但是,如果这两个并发请求是针对同一会话的(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。 第二个请求将只在第一个请求完成之后执行。 (如果由于第一个请求超过了锁定超时时间而导致对会话信息的独占锁定被释放,则第二个会话也可获得访问权。)如果将 @ Page 指令中的 EnableSessionState 值设置为 ReadOnly,则对只读会话信息的请求不会导致对会话数据的独占锁定。 但是,对会话数据的只读请求可能仍需等到解除由会话数据的读写请求设置的锁定。摘自:http://msdn.microsoft.com/zh-cn/library/ms178581(v=vs.100).aspx
测试代码x.aspx如下
<%@page language="C#" Debug="true"%> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { if (Request["img"] == "1") { System.Threading.Thread.Sleep(20000);//挂起20s Response.Write(DateTime.Now); Response.End(); } //如果下面这句是启用的,注释掉这句后刷新页面也不能马上生效,还得重启过网站,然后再打开这个页面就,点击send后打开链接就能立刻打开了,不被挂起 // Session["abc"] = "111"; } </script> <script> function Send() { var xhr = new XMLHttpRequest(); xhr.open("get", "x.aspx?img=1", true); xhr.onreadystatechange = function () { if (xhr.readyState == 4) alert(xhr.responseText); } xhr.send(null); } </script> 点击send后启动ajax,再点击下面连接打开x.aspx页面,会一直被挂起直到ajax返回后才能打开,x.aspx页面的内容页就是贴出来的<br /> <input type="button" value="Send" onclick="Send()" /><br /> <a href="x.aspx" target="_blank">x.aspx</a>
加支付宝好友偷能量挖...
原创文章,转载请注明出处:asp.net/asp网站浏览器打开一个长时间运行的页面同时打开其他页面为什么被挂起