XMLHttpRequest不通过IE11中的代理终止DELETE请求

时间:2016-10-07 12:46:28

标签: angular typescript internet-explorer-11 http-proxy

我有一个Angular2(2.0.1)应用程序,它在Jersey后端应用程序上调用ReST API。在Internet Explorer 11上,问题是DELETE请求正确执行,但回调不会立即执行。仅在120秒后(我猜一些超时)才会调用回调。在网络级别,我可以看到立即响应,所以我猜问题是在IE或Angular2 http库中,可能仅在“204 No Content”回复的情况下。

[编辑]:如果状态为204的空响应,GET请求也会以这种方式运行。

正如您在开发人员工具中看到的那样,请求已暂停一段时间: Pending state

120秒后,请求已完成。此时调用回调函数: Finished after 120 seconds

请注意,只有通过我们的公司代理访问后端API且仅在IE 11上访问时才会发生这种情况。

按如下方式触发呼叫:

doDelete(id: string) {
    this.http.delete(this.deleteUrl + id)
        .subscribe(
            data => { this.ngOnInit(); },
            error => { window.alert(error) });
}

这里是网络跟踪:

DELETE http://yyy.yyy.at/types/76856ad1-342c-41d0-a627-71cd02d586a8 HTTP/1.1
Accept: */*
authorization: Bearer b50cd05c-0314-4557-aa66-cf9c9f356e31
Referer: http://yyy.yyy.at/types
Accept-Language: de-AT
Origin: http://yyy.yyy.at
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Length: 0
Host: yyy.yyy.at
Proxy-Connection: Keep-Alive
Pragma: no-cache

HTTP/1.0 204 No Content
Date: Fri, 07 Oct 2016 06:54:45 GMT
Server: Apache-Coyote/1.1
Cache-Control: no-cache
Access-Control-Allow-Origin: http://yyy.yyy.at
Access-Control-Allow-Credentials: true
Set-Cookie: 9047e7349d0e3de4224ae4053da5d560=b44c49344740b5a0b58b8fdd51b15bdc; path=/; HttpOnly
X-Cache: MISS from xxx.xxx.net
X-Cache-Lookup: MISS from xxx.xxx.net:8080
X-Cache: MISS from xxx.xxx.at
X-Cache-Lookup: MISS from xxx.xxx.at:8080
Via: 1.1 PSxxx, 1.1 xxx.xxx.net:8080 (squid/2.7.STABLE9), 1.0 xxx.xxx.at:8080 (squid/2.7.STABLE9)
Connection: keep-alive
Proxy-Connection: keep-alive

1 个答案:

答案 0 :(得分:1)

Internet Explorer 11也为我做了这个,但是我很努力地确保将Content-Length设置为0来修复它,即使使用HTTP 204作为响应代码也是如此。

如果其他人遇到此问题,在Internet Explorer中查看是否为超时问题的最简单方法是在IE(错误地)等待数据时中断/重新启动API服务器。因为中断将终止TCP连接,IE将检查它具有哪些数据并尝试到期 - 毕竟,状态代码表示成功,并且因为实际上不应该有任何内容,所以你的代码无论如何都可能有用。

在我的情况下,超时是在大约60秒后发生的,但这可能是由于我的AWS Elastic LoadBalancer配置使空闲连接保持打开状态很长时间。