2016-10-07 4 views
0

У меня есть приложение Angular2 (2.0.1), которое вызывает API-интерфейс ReST на бэкэнд-приложении Джерси. В Internet Explorer 11 проблема заключается в том, что запросы DELETE выполняются правильно, но обратный вызов не выполняется немедленно. Только через 120 секунд (я думаю, какой-то тайм-аут) вызывающий вызов вызван. На сетевом уровне я вижу немедленный ответ, поэтому, я думаю, проблема заключается либо в IE, либо в HTTP-библиотеке Angular2, вероятно, только в случае ответа «204 Нет содержимого».XMLHttpRequest не завершает запрос DELETE через прокси-сервер в IE11

[Изменить]: Также запросы GET ведут себя таким образом в случае пустого ответа со статусом 204.

Как вы можете видеть в инструментах разработчика, запрос находится на рассмотрении в течение некоторого времени: 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 
+0

Обходной путь, который я нашел, - ответить кодом 200 вместо 204 и установить «Content-Length: 0». – Black

ответ

0

Internet Explorer 11 сделал это для меня тоже, но старательно делая сюр e, что был установлен в 0, он исправил его для меня, даже с HTTP 204 в качестве кода ответа.

Если кто-то еще испытывает эту проблему, самый простой способ проверить, является ли это проблемой тайм-аута в Internet Explorer, - это прерывать/перезапускать ваш сервер API, пока IE (некорректно) ожидает данных. Поскольку прерывание прекратит соединение TCP, IE проверит, какие данные у него есть, и попытается сделать это - в конце концов, в коде состояния говорится, что успех был успешным, и поскольку на самом деле не должно быть никакого контента, ваш код скорее всего, будет работать.

В моем случае таймаут пришел примерно через 60 секунд, но это, вероятно, связано с моей конфигурацией AWS Elastic LoadBalancer, которая долгое время открывала незанятые соединения.