Ajax长轮询未正确工作

4
我正在使用MVC 2中的长轮询开发一个简单的陌生人聊天应用程序。如果我在不同的浏览器中打开应用程序,比如在IE和Mozilla中加载应用程序,那么它在我的开发机器上可以正常工作。
但是,如果我在一个浏览器(例如IE)的两个选项卡中打开应用程序,则两个选项卡都无法启动长轮询。我的意思是,有一个开始按钮来启动聊天,它会触发长轮询。在调试时,我可以看到它调用了操作。我的问题是,当我从选项卡一中点击开始按钮时,它会发送一个ajax请求(长轮询(此请求在服务器上等待直到另一个请求到来))。然后我在选项卡二中点击开始按钮时,它不会发送ajax请求,直到第一个请求从服务器返回(超时后)。
这是为什么?我读过类似浏览器会阻止多个ajax请求的文章。这是原因吗?如果我使用不同的浏览器,它就可以正常工作。问题只出现在同一浏览器的两个选项卡中。

1
只是猜测,但您是否确保响应从未被缓存,使用 Response.Cache.SetCacheability(HttpCacheability.NoCache) ?如果请求根本没有被发出,我建议使用 fiddler 进行调试。 - emfurry
1个回答

6
我了解到您想翻译的内容是关于IT技术,具体而言是浏览器可能会阻止多个ajax请求。如果您使用会话,ASP.NET会阻止来自同一会话的并发请求。摘自文档

每个会话对ASP.NET会话状态的访问都是互斥的,这意味着如果两个不同的用户进行并发请求,则分别同时授予对每个单独会话的访问权。但是,如果通过使用相同的SessionID值为同一会话进行两个并发请求,则第一个请求将独占对会话信息的访问权。只有在第一个请求完成后,第二个请求才执行。(如果第一个请求超过了锁定超时时间,则第二个会话也可以获得访问权限,因为信息上的排他性锁定已被释放)。如果在@ Page指令中设置的EnableSessionState值为ReadOnly,则针对只读会话信息的请求不会导致对会话数据的独占锁定。但是,针对会话数据的只读请求仍可能必须等待由读写请求设置的锁定清除。

此外,请确保您已禁用缓存。例如,如果您使用jQuery,在轮询时使用cache: false选项。
$.ajax({
    url: '/poll',
    cache: false,
    success: function(result) {
        // ...
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接