惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
PCI Perspectives
PCI Perspectives
K
Kaspersky official blog
T
Tenable Blog
Help Net Security
Help Net Security
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
罗磊的独立博客
P
Palo Alto Networks Blog
爱范儿
爱范儿
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
人人都是产品经理
人人都是产品经理
L
LangChain Blog
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
博客园_首页
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
S
Secure Thoughts
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
V2EX
Last Week in AI
Last Week in AI
H
Heimdal Security Blog
U
Unit 42
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
SecWiki News
SecWiki News
量子位
博客园 - 【当耐特】
Martin Fowler
Martin Fowler
NISL@THU
NISL@THU
S
Securelist
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
云风的 BLOG
云风的 BLOG
I
Intezer
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - Franky
Cisco Talos Blog
Cisco Talos Blog
小众软件
小众软件
C
CXSECURITY Database RSS Feed - CXSecurity.com

博客园 - zhangbaoyu

jquery.chosen.js实现模糊搜索 SQL Server 使用日志传送 SQL Server 2008 R2 主从数据库同步 JavaScript及C# URI编码详解 sql server日期时间函数 MySQL十大优化技巧 - zhangbaoyu - 博客园 第一季 开封菜。。。。 Eval( " ")和DataBinder.Eval(Container.DataItem, " ") Navicat 一学生问英语老师“山寨”的英语怎么说,老师沉默不语。过了一会儿,幽幽的转过头来,一顿一顿的说道:made in china... MySQL DATE_FORMAT() 函数 js日期时间格式验证,时间比较 笔记本显卡排名 如何使用URL跳转解决Web服务80端口被封问题? vb.net sqlserver 寒山诗选 c# 写入文件日志 - zhangbaoyu - 博客园 c# smtp发送邮件
Asp.net项目因Session阻塞导致页面打开速度变慢
zhangbaoyu · 2016-07-31 · via 博客园 - zhangbaoyu

2016-07-31 21:21  zhangbaoyu  阅读(1351)  评论()    收藏  举报

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

  开始我一直怀疑是不是浏览器单线程的缘故,在网上搜索了资料,IE6/7,FF都是多线程浏览器(IE6好像是2个线程),用IE6、IE7、FF都试过了,结果一样,这就奇怪了,明明都是多线程,怎么会阻塞呢?

  在网上搜索了好几次相关的问题,还是没查出个所以然,但网站造成的客户体验确实很差,每当访问到那个耗时的A页面时,再想访问其他页面根本查看不了。“怎么系统那么慢”,晕,没办法,我也不懂怎么处理(不负责任的态度啊,呵呵)。

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

  经过多次尝试和比对,才发现这两个页都是无需登陆验证的页面,之前出现阻塞的页面都是需登陆验证后才可访问的页面,而系统的验证信息是存储在Session中,通过Session判断验证的。这时想到应该是Session的问题,但还是不知如何处理,再去网上搜索,互联网上的信息真是应有尽有,终于搜索到问题所在:

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

  问:为了可以顺序访问Session的状态值,Session是否提供了锁定机制?

  答:Session实现了Reader/Writer的锁机制:

  当页面对Session具有可写功能(即页面有<%@ Page EnableSessionState="True" %>标记),此时直到请求完成该页面的Session持有一个写锁定。

  当页面对Session具有只读功能(即页面有<%@ Page EnableSessionState="ReadOnly" %>标记),此时知道请求完成该页面的Session持有一个读锁定。

  读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Session时,其中一个要等待另一个(稍快的那个)完成后,才开始写。

  可查看这里http://www.bitsCN.com/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="TBS_Monitor_List.aspx.cs" EnableSessionState="ReadOnly"  Inherits="TBS_Monitor_List" %> ,问题解决。