Разница между временем ожидания операции и (504) временем ожидания шлюза

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

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

их детали как:

Система.Сеть.WebException: время ожидания операции истекло в Системы.Чистая.Класса HttpWebRequest.Метод GetResponse() на ......

и

Система.Сеть.WebException: удаленный сервер вернул ошибку: (504) Время Ожидания Шлюза. в системе.Чистая.Класса HttpWebRequest.Метод GetResponse() на ....

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

моя функция как:

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.

4 ответов


в отстойный условия...

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

  1. плохое подключение к интернету (если они все бросают эту ошибку, то это вероятно).
  2. плохое соединение с хостом (у кого бы вы ни подключались, есть проблема).
  3. плохой DNS (если хост является доменным именем, это может быть виновником).
  4. плохой хост-агент (что-то на хост-конце не отвечает должным образом).

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

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

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

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


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

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

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

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

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

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


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


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

пока

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

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

исправление 504 ошибок-общие

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