当会话处于活动状态时,我无法在asp.net中一次提出多个请求.为什么这个限制存在?有办法解决吗?
@H_301_2@这个问题可以通过一个只有3个简单的aspx页面的WebForms应用程序进行演示(尽管这个限制仍然适用于asp.net mvc).
@H_301_2@创建一个asp.net 3.5 web应用程序.
@H_301_2@应该只有三页:
NoWait.aspx,Wait.aspx和SessionStart.aspx @H_301_2@NoWait.aspx在默认的div标签之间添加了这个单独的块块:<%= DateTime.Now.Ticks%> ;.此页面的代码隐藏是默认(空). Wait.aspx看起来就像NoWait.aspx,但是它有一行添加到代码隐藏中的Page_Load:Thread.Sleep(3000); //等待3秒 SessionStart.aspx也看起来就像NoWait.aspx,但它的代码隐藏着这一行:Session [“Whatever”] =“Anything”; 打开浏览器并转到NoWait.aspx.它在回复中正确显示了一个数字,如:“633937963004391610”.保持清爽,不断变化.到目前为止!在同一浏览器中创建一个新的标签页,然后转到Wait.aspx.它坐了3秒钟,然后将数字写入响应.到目前为止!不,尝试这样做:转到Wait.aspx,当它旋转时,快速标签到NoWait.aspx并刷新.即使Wait.aspx正在睡眠,NoWait.aspx将提供响应.到目前为止当Wait.aspx正在旋转时,您可以继续刷新NoWait.aspx,并且服务器每次都快乐地发送响应.这是我期望的行为. 现在是奇怪的地方. 在第三个选项卡中,在同一个浏览器中,访问SessionStart.aspx.接下来,标签到Wait.aspx并刷新.当它旋转时,选中到NoWait.aspx并刷新. NoWait.aspx将不会发送回应直到Wait.aspx完成运行! 这证明,当会话处于活动状态时,您不能与同一用户进行并发请求.请求都排队等候并同步服务.我不期待或理解这种行为.我已经在Visual Studio 2008的内置Web服务器以及IIS 7和IIS 7.5中进行了测试. 所以我有几个问题: 1)我正确的是,这里确实有一个限制,还是我上面的测试无效,因为我做错了? 2)有没有办法解决这个限制?在我的网络应用程序中,某些事情需要很长时间才能执行,我希望用户能够在其他选项卡中执行任务,同时等待大量请求完成.我可以以某种方式配置会话以允许“脏读”吗?这可能会阻止它在请求期间被锁定? 3)为什么存在这个限制?我想很好地了解为什么这个限制是必要的.我认为如果我知道我会是一个更好的开发者
NoWait.aspx,Wait.aspx和SessionStart.aspx @H_301_2@NoWait.aspx在默认的div标签之间添加了这个单独的块块:<%= DateTime.Now.Ticks%> ;.此页面的代码隐藏是默认(空). Wait.aspx看起来就像NoWait.aspx,但是它有一行添加到代码隐藏中的Page_Load:Thread.Sleep(3000); //等待3秒 SessionStart.aspx也看起来就像NoWait.aspx,但它的代码隐藏着这一行:Session [“Whatever”] =“Anything”; 打开浏览器并转到NoWait.aspx.它在回复中正确显示了一个数字,如:“633937963004391610”.保持清爽,不断变化.到目前为止!在同一浏览器中创建一个新的标签页,然后转到Wait.aspx.它坐了3秒钟,然后将数字写入响应.到目前为止!不,尝试这样做:转到Wait.aspx,当它旋转时,快速标签到NoWait.aspx并刷新.即使Wait.aspx正在睡眠,NoWait.aspx将提供响应.到目前为止当Wait.aspx正在旋转时,您可以继续刷新NoWait.aspx,并且服务器每次都快乐地发送响应.这是我期望的行为. 现在是奇怪的地方. 在第三个选项卡中,在同一个浏览器中,访问SessionStart.aspx.接下来,标签到Wait.aspx并刷新.当它旋转时,选中到NoWait.aspx并刷新. NoWait.aspx将不会发送回应直到Wait.aspx完成运行! 这证明,当会话处于活动状态时,您不能与同一用户进行并发请求.请求都排队等候并同步服务.我不期待或理解这种行为.我已经在Visual Studio 2008的内置Web服务器以及IIS 7和IIS 7.5中进行了测试. 所以我有几个问题: 1)我正确的是,这里确实有一个限制,还是我上面的测试无效,因为我做错了? 2)有没有办法解决这个限制?在我的网络应用程序中,某些事情需要很长时间才能执行,我希望用户能够在其他选项卡中执行任务,同时等待大量请求完成.我可以以某种方式配置会话以允许“脏读”吗?这可能会阻止它在请求期间被锁定? 3)为什么存在这个限制?我想很好地了解为什么这个限制是必要的.我认为如果我知道我会是一个更好的开发者
解决方法
Here is a link talking about session state and locking.它执行和排他锁.
@H_301_2@最简单的方法是使长时间运行的任务异步.您可以使长时间运行的任务在单独的线程上运行,或者使用和asynchronous delegate并立即向浏览器返回响应.客户端页面可以向服务器发送请求,以查看是否完成(最可能通过ajax),当服务器通知客户端完成后,通知用户.这样虽然服务器请求必须由服务器一次处理一次,但它看起来不像用户那样.
@H_301_2@这确实有它自己的一系列问题,你必须确保HTTP上下文关闭的帐户,因为这将在asp.net会话中处理某些功能.您可能需要考虑的一个例子可能是释放会话锁,如果实际发生.
@H_301_2@这并不奇怪,这可能是一个限制.每个浏览器都有自己的会话,在ajax出现之前,发回请求是同步的.使同一个会话句柄并发可能会变得很丑,我可以看到这不是IIS和ASP.NET团队添加的优先级.