Разница между операцией имеет тайм-аут и (504) Тайм-аут шлюза

Я использую HttpWebRequest в своем приложении, которое проверяет некоторый URI в нескольких потоках. Я получаю несколько типов исключений времени.

  • Операция завершена
  • Удаленный сервер возвратил ошибку: (504) Тайм-аут шлюза.

Их детали похожи на:

System.Net.WebException: операция завершена на System.Net.HttpWebRequest.GetResponse() at......

и

System.Net.WebException: удаленный сервер возвратил ошибку: (504) Тайм-аут шлюза. в System.Net.HttpWebRequest.GetResponse() at....

В чем разница между этими двумя.

Моя функция похожа:

public bool CheckUri(Uri m_url)
{
    try
    {
        HttpWebRequest request = HttpWebRequest.Create(m_url) as HttpWebRequest;
        request.UserAgent = "MyUserAgent";

        //For: The underlying connection was closed: An unexpected error occurred on a receive.
        request.KeepAlive = false; 
        request.ProtocolVersion = HttpVersion.Version10;

        request.Method = "HEAD"; //Get only the header information 
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            int statusCode = (int)response.StatusCode;
            if (statusCode >= 100 && statusCode < 400) //Good requests
            {
                string sContent = null;
                using (var stream = response.GetResponseStream())
                using (StreamReader loResponseStream = new StreamReader(stream))
                    sContent = loResponseStream.ReadToEnd();
                return true;

            }
            else
            {
                return false;
                //hard to reach here
            }
        }
    }
    //vexing exception
    catch (WebException ex)
    {
        if (ex.Status == WebExceptionStatus.ProtocolError) //400 errors
        {
            var response = ex.Response as HttpWebResponse;

            if (response != null)
            {
                Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
                Console.WriteLine(response.StatusCode);
            }
        }
        else
        {
            Console.WriteLine(ex.Message);
        }
        return false;

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
}

Также, если кто-нибудь скажет мне, возникла бы проблема, если несколько потоков вызовут этот метод с разными URI. У меня нет исключения перекрестных потоков. Этот метод фактически является частью службы Windows, которая контролирует список из почти 200 URI.

Ответ 1

В самых сложных условиях...

"Операция" Тайм-аут "означает, что ваша программа, отправляющая запрос, отключилась, ожидая ответа. Это может означать:

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

В этих случаях я бы вручную проверил подключения к зараженному хосту и разрешил эти проблемы таким образом. Сначала попробуйте проверить свое собственное подключение и другие хосты. Если проблема связана с конкретным хостом, у них могут возникнуть проблемы, о которых вам нужно связаться.

Когда вы получаете "504 - Gateway Timeout", это означает, что ваша программа успешно соединилась с хостом, но что-то пошло не так на стороне хоста, и оно не могло вернуть желаемый ответ. Это не проблема соединения, а проблема как в запросе, так и в самом хосте. Возможно, хозяин застрял в бесконечном цикле, пытаясь обработать ваш запрос, или просто "висел", а агент, обрабатывающий ваш запрос, сдался и отправил ваш запрос обратно.

В этих случаях я бы посмотрел на хост, возможно, выполнил тестовые запросы, которые принимал хост. Если хост не находится под вашим контролем, свяжитесь со всем, кто он есть, и сообщите об ошибке.

Итак - короче. Первый тайм-аут, вероятно, связан с соединением, в то время как время ожидания 504, вероятно, является хостинговой обработкой. Надеюсь, это поможет.

Ответ 2

Время выполнения операции - ошибка клиента. Обычно это вызвано различными *Timeout свойствами WebRequest (и его потомков): Timeout, ContinueTimeout, ReadWriteTimeout. Если сервер, на который вы отправили запрос, не отвечает в течение установленного вами тайм-аута, вы получаете TimeoutException.

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

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

Вы ничего не можете сделать об этой ошибке, только администраторы сервера могут это решить. Если ошибка вызвана перегрузкой, вы можете попробовать несколько раз, но это слишком часто приносит больше вреда, чем пользы.

В общем случае, если вы не получаете HTTP-код, это исключение из .NET. Если вы получите код HTTP, вы можете посмотреть на первую цифру:

2** OK
3** Перенаправление
4** Ошибка клиента
5** Ошибка сервера

Ответ 3

Вы можете обратиться к этой ссылке для "Истекло время ожидания операции", и проблема может быть связана с тем, что сервер уже занят какой-то задачей. И (504) Тайм-аут шлюза означает, что один сервер не получал своевременного ответа от другого сервера, к которому он обращался при попытке загрузить веб-страницу или заполнил другой запрос браузером.

Ответ 4

Операция завершена происходит, когда определенное время определено, и сервер не может ответить назад в это конкретное время (происходит внутри удаленного сервера)

while

504 ошибки в HTTP-цикле (происходит при обмене данными между клиентом и сервером) Любой клиент (например, ваш веб-браузер или наш робот CheckUpDown) проходит следующий цикл, когда он общается с веб-сервером:

Получить IP-адрес из IP-имени сайта (URL-адрес сайта без ведущего "http://" ). Этот поиск (преобразование IP-адреса на IP-адрес) предоставляется серверами доменных имен (DNS). Откройте соединение IP-сокета с этим IP-адресом. Запишите поток данных HTTP через этот сокет. Получите в ответ HTTP-поток данных с веб-сервера. Этот поток данных содержит коды состояния, значения которых определяются протоколом HTTP. Разбирайте этот поток данных для кодов состояния и другой полезной информации. Эта ошибка возникает на последнем шаге выше, когда клиент получает код состояния HTTP, который он распознает как "504". (Последнее обновление: март 2012 г.).

Фиксирование 504 ошибок - общий

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