1

在我的 web 应用程序中,我有一个从代码隐藏生成并绑定到转发器控件的链接列表。单击链接会打开一个弹出窗口,在该窗口中,除了显示一些数据外,还会对 WCF 服务进行异步调用(通过 javascript 代理)。该服务反过来调用另一个可能需要很长时间才能响应的第三方 Web 服务。我正在使用 IE6,这是一个不可避免的要求。

现在,如果用户决定不等待调用完成并关闭弹出窗口,我会在 onunload 时中止此服务。问题是,如果用户在之后立即单击转发器中的另一个链接,新的弹出窗口将打开但不会加载页面(不转到提供的 URL),直到上一个异步调用完成(我已经验证了这一点通过提琴手)。有趣的是,这只发生在同一域内的链接上。如果我将其中一个 popus 的链接更改为 www.google.com,则窗口将打开并按预期转到正确的 url。但是,对于在我自己的域中包含链接的弹出窗口,在关闭带有未完成请求的弹出窗口后立即打开,它会等到前一个请求完成后再加载 url。

我已经验证了中止回调的正确方法,并且 abort 确实会正确触发。我也知道我只能中止我的客户端调用,而不是服务器端调用,我不在乎。我唯一的要求是浏览器加载下一个链接,而不考虑之前的异步响应。

//Method to Call Service:

    function GetData(Id) {

            //call the service

            Sys.Net.WebRequestManager.add_invokingRequest(On_InvokingRequest);

            var service = new WrapperService();
            service.GetData(Id, handleSuccess, handleError, null);

            Sys.Net.WebRequestManager.remove_invokingRequest(On_InvokingRequest);
        }

//method to get the current requests abort executor
function On_InvokingRequest(executor, eventArgs) {
        var currentRequest = eventArgs.get_webRequest();
        abortExecutor = currentRequest.get_executor();
    }

//abort service on unload
function unload() {
        if (abortExecutor != null) {
            abortExecutor.abort();
        }
    }

背景的有用/类似链接:

browser-waits-for-ajax-call-to-complete-even-after-abort-has-been-called-jquery aborting-an-asp-net-web-service-asynchronous-call canceling-ajax-web-service-称呼

有人遇到过这个吗?它让我发疯!任何帮助将不胜感激。

4

1 回答 1

0

您的一个链接中的答案对我来说听起来像是问题: 即使在调用 abort (jQuery) 之后,浏览器也会等待 ajax 调用完成

您的服务是否需要会话状态?

您可以通过将 IE 配置为允许超过 2 个对同一域的请求来证明问题是否在于 IE 本身不会发出请求。如果它被阻止是因为中止的请求以某种方式占用了其中一个连接,那么增加它应该会产生不同的结果。如果还是有问题,肯定是服务器在等待响应。

为 2 个以上的请求配置 IE:http: //support.microsoft.com/kb/282402

引用您链接的 SO 问题之一:

事实证明,我完全错误地认为这是一个浏览器问题——问题出在服务器上。ASP.NET 对需要会话状态的同一会话的请求进行序列化,因此在这种情况下,直到这些 ajax 发起的请求完成后,下一页才会开始在服务器上处理。

不幸的是,在这种情况下,响应 ajax 调用的 http 处理程序需要会话状态。但是只读访问已经足够好了,因此通过使用 IReadOnlySessionState 而不是 IRequiresSessionState 标记处理程序,不会持有会话锁并且问题得到解决。

于 2009-07-21T06:30:03.223 回答