会话状态阻止同步处理的异步ajax调用

时间:2012-06-28 01:15:22

标签: asp.net session jquery pagemethods

我正在尝试在document.ready上同时对我的.NET页面方法进行6次异步jQuery ajax调用,以从数据库请求不同的数据集,并作为图表呈现给用户。

问题是,当一个图表需要很长时间才能生成时,它会锁定后续5个图表的生成,例如,当每个图表需要1分钟生成时,用户将大约等待6分钟,而不是我认为使用异步ajax调用和页面方法并行处理1到2分钟。

在这个论坛上阅读了很多有用的帖子之后,我发现这是因为我必须在页面方法中读取和写入会话对象,而asp.net将锁定整个请求,从而使它们运行顺序。

我见过有人建议将会话状态设置为仅在@Page标签中读取,但它不会解决我的问题,因为我还需要写入会话。我考虑过从inProc会话转到sql数据库会话,但是我的会话对象不是可序列化的,并且在整个项目中使用。我也无法更改为使用缓存,因为会话包含用户特定的详细信息。

任何人都可以帮助并指出正确的方向吗?我花了几天时间研究这个页面效率低下,但还没有找到一个好方法。

提前致谢

2 个答案:

答案 0 :(得分:2)

根据我的个人经验,切换到SQL会话将无法解决此问题,因为所有并发线程都将在SQL中阻塞,因为第一个线程将在数据库中的一个或多个行上保持独占锁。

我很好奇为什么你的会话对象不可序列化。我能想到的唯一解决方案是使用数据库表来存储您在会话中保留的用户特定数据,然后只需保留数据库锁定就可以更新用户数据。

您可以使用ASP.NET会话ID或其他唯一cookie值作为数据库密钥。

答案 1 :(得分:1)

问题可能根本不是服务器端。

浏览器对它们将发出的并发HTTP请求数量有内置限制 - 这是HTTP / 1.1规范的一部分,它取消了2的限制。

在IE7中,限制为2.在IE8中它是6.但是当页面加载时,由于CSS,JS,图像等的并发请求,你可以很容易地命中6。

有关这些限制的良好信息来源是BrowserScope(请参阅每个主机名的连接列)。

如何将这6个请求合并为1个请求?这也会加快一点。