ASP.NET中Session造成请求阻塞现象

现象:在一个网站中,当访问一个处理比较耗时的页面,比如下载文件的页面等(A页面),页面请求还没有返回时,此时再点击访问该网站的其他页面(B页面)会出现B页面很久都没有响应和返回,直到A页面输出返回数据时才开始处理B页面的请求,造成请求排队处理,A页面阻塞了B页面的请求处理。

一开始怀疑是不是window.open的缘故,因为一开始发现问题的情况是,通过 window.open打开一个新的子页面去下载文件,在文件下载完成之前,父页面刷新的话,请求会阻塞直到子页面下载完成。

后来发现即使不是window.open打开的页面也会有阻塞的现象。于是怀疑是不是浏览器单线程的缘故,在网上搜索了资料,IE6/7,FF都是多线程浏览器(IE6好像是2个线程),用IE6、IE7、FF都试过了,结果一样,这就奇怪了,明明都是多线程,怎么会阻塞呢?

在一次的无意中我发现竟然在A页面Loading的时候,可以访问某个页面,真是惊喜,再试试几次,可以,确实可以,是不是页面代码阻塞了?于是查这两个页面的代码,其实这两个页面的代码就十几行,没什么问题呢。

经过多次尝试和比对,才发现这两个页都是无需登陆验证的页面,之前出现阻塞的页面都是需登陆验证后才可访问的页面,而系统的验证信息是存储在Session中的。

这时想到应该是Session的问题,但还是不知如何处理,再去网上搜索,终于搜索到问题所在:

/************************************************************/

问:为了可以顺序访问Session的状态值,Session是否提供了锁定机制?
答:Session实现了Reader/Writer的锁机制:
当页面对Session具有可写功能(即页面有<%@ Page EnableSessionState=”True” %>标记),此时直到请求完成该页面的Session持有一个写锁定。
当页面对Session具有只读功能(即页面有<%@ Page EnableSessionState=”ReadOnly” %>标记),此时知道请求完成该页面的Session持有一个读锁定。
读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Session时,其中一个要等待另一个(稍快的那个)完成后,才开始写。

可查看这里http://www.jb51.net/article/9442.htm

/************************************************************/

“写锁定将阻塞所有的读写锁定”,也就是说页面在EnableSessionState=”True”的情况下没返回输出时,一直持着Session写操作,其他页面对Session的读操作必须等待,而asp.net的aspx页面默认是EnableSessionState=”True”,每个页面从请求开始至返回一直持着Session写操作,需验证页面必须读取Session值判断,这就是为什么需验证的页面请求被阻塞的原因。只要耗时页面(A页面)没有Session的写操作,也就不会阻塞其他页面的请求,于是修改A页面的EnableSessionState=”ReadOnly”,例如:<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”xxx.aspx.cs” EnableSessionState=”ReadOnly”  Inherits=”xxx” %> ,问题解决。

 

希望以上对碰到同样问题的同仁有所帮助。

原创文章,转载请注明: 转载自闲云博客

本文链接地址: ASP.NET中Session造成请求阻塞现象

发表评论

电子邮件地址不会被公开。 必填项已用*标注