我正在使用MVC 2中的长轮询开发一个简单的陌生人聊天应用程序。如果我打开应用程序不同的浏览器,它在我的开发机器上工作正常..我的意思是如果我在IE和Mozilla中加载应用程序,它工作正常
如果我在浏览器的两个选项卡中使用了这个应用程序(例如:IE),那么长轮询不会从两个选项卡中触发..我的意思是,有一个开始按钮来启动聊天,这会触发长时间轮询。我可以看到它在调试时调用动作..而我的问题是,当我从第一个选项卡中单击启动按钮时,它会触发ajax请求(长轮询(此请求在服务器上等待,直到另一个请求来))然后我单击在选项卡2中的启动按钮,它不会触发ajax请求,直到从服务器返回第一个请求(超时后)。
为什么会这样?我阅读像浏览器将阻止多个ajax请求..这是一个原因吗? ..如果我使用不同的浏览器,它的工作正常。只有当我在同一个浏览器中使用两个选项卡时才会出现问题
答案 0 :(得分:6)
我读过像浏览器一样会阻止多个ajax请求。
是的,如果使用会话,ASP.NET会阻止来自同一会话的并发请求。引自documentation:
访问ASP.NET会话状态是 每次会议独享,这意味着 如果有两个不同的用户 并发请求,访问每个 单独的会话被授予 同时。但是,如果两个 并发请求是为了 同一会话(使用相同的会话 SessionID值),第一个请求 获得对会话的独占访问权限 信息。第二个请求 仅在第一个请求之后执行 完了。 (第二次会议可以 如果独占锁也可以访问 因为信息被释放了 第一个请求超过锁定 超时。)如果是EnableSessionState @ Page指令中的值已设置 ReadOnly,请求 只读会话信息没有 导致独占锁定 会话数据。但是,只读 会话数据的请求可能仍然存在 必须等待一个锁定 会话数据的读写请求 清楚。
还要确保您已禁用缓存。例如,如果使用jquery,则在轮询时使用cache: false
选项:
$.ajax({
url: '/poll',
cache: false,
success: function(result) {
// ...
}
});