来源: 最后更新:24-07-02 09:06:03
最近在写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阻塞的情况了。
标签: [db:关键词]
93年男子借万元去韩国被拒,杀害小姨强奸表妹,26年后在韩国被抓
西安大三女生退房租遭辱骂后喝农药自杀 二审维持原判:房东赔偿19万元
施小琳任四川省副省长、代理省长(四川省委书记施小林)
中金女员工离世受关注背后:券商降薪潮已告别“人均百万”
“五角大楼就是摆脱不了华为,和国会摊牌”
衡水两民办校天津复读班招生收款方为传媒公司引质疑,律师称或存隐患
美媒:《纽约时报》曝“拜登告诉盟友,自己正权衡是否继续参选”,白宫副发言人否认
极右翼胜选223天后,荷兰迎来新政府,将实施“有史以来最严移民政策”
发动机故障灯亮的大部分原因 发动机故障灯亮了的原因是什么
游玩深圳16好去处(深圳游玩必去)
93年男子借万元去韩国被拒,杀害小姨强奸表妹,26年后在韩国被抓
洗脸用温水还是冷水好(洗面奶洗脸用温水还是冷水好)温水洗脸(洗脸用温水还是冷水好)洗脸是每天早晚都要做的皮肤保养工
红烧牛肉面的懒人做法 家常版红烧牛肉面 枢密院十号:史上最贵战斗机,要黄了…… 英媒:乌克兰将被告知“因腐败严重,不适合加入北约” 穿越火线队路小北成员 穿越火线路小北最后拿冠军了吗?