Статус HTTP 504

Я получаю следующую ошибку, когда мое приложение win32 (С#) вызывает веб-службы.

The request failed with HTTP status 504: Gateway timeout server response timeout.

Я понимаю "я думаю", что это связано с тем, что запрос вверх не получает ответ своевременно.

Но это мой вопрос? Как изменить настройки app.config в моем приложении win32, чтобы предоставить больше времени для обработки его данных. Я предполагаю, что я требую, чтобы эти изменения были внесены в мои настройки приложения, так как веб-службы и IIS-хостинг ws настроены с расширенными временными интервалами.

Посмотрите вперед и ответьте заранее.

Скотт

Ответ 1

Вы не можете. Проблема не в том, что ваше приложение нетерпеливое и время от времени; проблема заключается в том, что промежуточный прокси является нетерпеливым и хроническим. "Сервер, действуя как шлюз или прокси, не получил своевременного ответа от восходящего сервера, указанного в URI". (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5) Скорее всего, это указывает на то, что исходный сервер имеет какую-то проблему, поэтому он не быстро реагирует на перенаправленный запрос.

Возможные решения, ни одна из которых вряд ли сделает вас счастливыми:

  • Увеличьте время ожидания прокси (если оно под вашим контролем)
  • Сделайте запрос на другой сервер (если есть другой сервер с теми же данными)
  • Сделайте свой запрос по-другому (если возможно), чтобы вы запрашивали меньше данных за раз
  • Повторите попытку, когда на сервере не возникнут проблемы.

Ответ 2

CheckUpDown имеет хорошее объяснение ошибки 504:

Сервер (не обязательно веб-сервер) выступает в качестве шлюза или прокси для выполнения запроса клиентом (например, вашим веб-браузером или нашим роботом CheckUpDown) для доступа к запрошенному URL-адресу. Этот сервер не получал своевременного ответа от восходящего сервера, к которому он обращался, для обработки вашего HTTP-запроса.

Это обычно означает, что восходящий сервер не работает (нет ответа на шлюз/прокси), а не тот, что восходящий сервер и шлюз/прокси не согласны с протоколом обмена данными.

Эта проблема полностью связана с медленной IP-связью между внутренними компьютерами, возможно, включая веб-сервер. Только люди, которые настроили сеть на сайте, на котором размещен веб-сервер, могут решить эту проблему.

Ответ 3

Предположим, что доступ к прокси-серверу A (например, nginx), а сервер A пересылает запрос другому серверу B (например, tomcat).

Если этот процесс продолжается в течение длительного времени (больше, чем время ожидания прокси-сервера для чтения), A все еще не получил завершенного ответа B. Это происходит.

для nginx, вы можете настроить свойство proxy_read_timeout (в местоположении), чтобы решить его. Но это обычно не очень хорошая идея, если вы установите слишком высокое значение. Это может скрыть реальную ошибку. Лучше бы улучшить дизайн, чтобы действительно решить эту проблему.

Ответ 4

Если ваш ASP.Net 5 (теперь известный как ASP.Net Core v1) обеспечивает в разделе "команды" project.json для каждого сайта, на котором вы размещаете, прослушивающий порт прокси-сервера Kestrel отличается между сайтами, иначе один сайт будет но другой вернет 504 тайм-аут шлюза.

 "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5090"
  },

Ответ 5

Одна вещь, которую я наблюдал в отношении этой ошибки, заключается в том, что она появляется только для первого ответа с сервера, который в случае HTTP должен быть ответом на подтверждение. Как только немедленный ответ отправляется с сервера на шлюз, если после основного ответа требуется время, это не дает ошибки. Ключевым моментом здесь является то, что первый ответ на запрос сервера должен быть быстрым.