最近在写Webform页面程序发现这样一个现象:在做导出功能时,由于导出数据的处理时间比较长,就在客户端加一个定时器通过ajax不间断查询导出进度。然后发现了一个情况,这个请求一直是阻塞的状态,直到导出事件处理完成之后。才去执行这个请求,也就是说如果响应时间长的请求还在进行中,短的请求却被挂起了。
百度了下,最终确定是Asp.Net Session造成的。原文:https://www.cnblogs.com/littlewrong/p/4783104.html
原理:Session实现了Reader/Writer的锁机制:
当页面对Session具有可写功能(即页面有<%@Page EnableSessionState=”True” %>标记),此时直到请求完成该页面的Session持有一个写锁定。
当页面对Session具有只读功能(即页面有<%@Page EnableSessionState=”ReadOnly” %>标记),此时知道请求完成该页面的Session持有一个读锁定。
读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Session时,其中一个要等待另一个(稍快的那个)完成后,才开始写。
“写锁定将阻塞所有的读写锁定”,也就是说页面在EnableSessionState=”True”的情况下没返回输出时,一直持着Session写操作,其他页面对Session的读操作必须等待,而asp.net的aspx页面默认是EnableSessionState=”True”,每个页面从请求开始至返回一直持着Session写操作,需验证页面必须读取Session值判断,这就是为什么需验证的页面请求被阻塞的原因。只要耗时页面(A页面)没有Session的写操作,也就不会阻塞其他页面的请求,于是修改A页面的EnableSessionState=”ReadOnly”,例如:<%@ Page Language=”C#” AutoEventWireup=”true”CodeFile=”TBS_Monitor_List.aspx.cs”EnableSessionState=”ReadOnly” Inherits=”TBS_Monitor_List” %> ,问题解决。
结论:也就是说,在无需对session进行写操作的页面,在Page指令加上EnableSessionState=”ReadOnly”属性,就不会造成Request阻塞的情况了。
海沧区石塘立交、 海沧石塘站
海沧区石塘立交、海沧大桥东渡路立交和仙岳路高架局部路段施工期间采取道路交通限行措施!(0)人阅读时间:2024-07-07欧洲杯-皮克福德扑点 皮克福德欧洲杯图片
欧洲杯-皮克福德扑点 英格兰点球大战6-4瑞士进四强,皮克福德,英格兰,点球大战,欧洲杯,扎卡,瑞士,沙奇里(0)人阅读时间:2024-07-07慈溪市第三轮九价HPV疫苗预约指南(慈溪市第三轮九价hpv疫苗预约指南最新)
根据慈溪疾控相关消息,慈溪市第三轮九价HPV疫苗摇号预约开启,2024年2月1日至2024年2月10日期间可以申请。(3)人阅读时间:2024-07-072024宁波慈溪九价疫苗怎么预约(宁波慈溪九价哪些医院可以打)
本次预约仅通过“浙里办”APP摇号方式进行,2023年12月1日起,九价HPV疫苗将不再接受现场预约,具体一起来看。(4)人阅读时间:2024-07-07涤纶网眼布的优点有哪些 涤纶网眼布区分正反面
蟹爪兰叶子发红为什么(蟹爪兰叶子发红为什么,花朵变干)
燃油助力车需要驾驶证吗(30cc燃油助力车需要驾驶证吗)
孩子生下来多久办户口 生了孩子多久上户口