web-dev-qa-db-fra.com

Différence entre l'opération a expiré et (504) expiration de la passerelle

J'utilise HttpWebRequest dans mon application qui vérifie certains URI dans plusieurs threads. Je reçois plusieurs types d'exceptions de délai d'attente. 

  • L'opération a expiré
  • Le serveur distant a renvoyé une erreur: (504) Timeout de la passerelle.

Leurs détails sont comme:

System.Net.WebException: l'opération a expiré à System.Net.HttpWebRequest.GetResponse () à ......

et 

System.Net.WebException: le serveur distant a renvoyé une erreur: (504) Timeout de la passerelle. sur System.Net.HttpWebRequest.GetResponse () sur ....

Quelle est la différence entre ces deux. 

Ma fonction est comme:

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;
    }
}

De plus, si quelqu'un pouvait me le dire, y aurait-il un problème si plusieurs threads appellent cette méthode avec des URI différents. Je ne reçois aucune exception de fil croisé. Cette méthode fait en réalité partie d'un service Windows qui surveille une liste de près de 200 URI. 

13
user2711965

En termes lamentables ...

"Opération expirée" signifie que VOTRE programme ayant envoyé la demande a expiré en attente d'une réponse. Cela pourrait signifier:

  1. Mauvaise connexion Internet (s'ils jettent tous cette erreur, c'est probable). 
  2. Mauvaise connexion hôte (la personne avec qui vous vous connectez a un problème).
  3. Mauvais DNS (si l'hôte est un nom de domaine, cela pourrait être un coupable).
  4. Mauvais agent hôte (quelque chose du côté de l'hôte ne répond pas correctement).

Dans ces cas, je testais manuellement les connexions à l'hôte concerné et résolvais ces problèmes de cette manière. Essayez de tester d'abord votre propre connexion et d'autres hôtes. Si le problème concerne un hôte spécifique, il peut avoir des problèmes pour lesquels vous devez les contacter.

Lorsque vous obtenez le message "504 - Gateway Timeout", votre programme s'est connecté avec succès à l'hôte, mais quelque chose s'est mal passé du côté de l'hôte et il n'a pas pu renvoyer la réponse souhaitée. Ce n'est pas un problème de connexion, mais un problème lié à la demande ou à l'hôte lui-même. Il se peut que l'hôte se soit retrouvé coincé dans une boucle infinie à essayer de traiter votre demande ou qu'il soit simplement "bloqué", et l'agent qui a traité votre demande a abandonné et renvoyé votre demande. 

Dans ces cas, je regarderais l'hôte, peut-être exécuter des demandes de test que l'hôte acceptera. Si l'hôte n'est pas sous votre contrôle, contactez qui que ce soit et signalez l'erreur.

Donc, en bref. Le premier délai d'attente est probablement lié à la connexion, tandis que le délai d'attente 504 correspond probablement au traitement de l'hôte. J'espère que cela t'aides.

23
Michael

L'opération a expiré est un client error. Cela est généralement dû à diverses propriétés *Timeout de WebRequest (et ses descendants): Timeout, ContinueTimeout, ReadWriteTimeout. Si le serveur auquel vous avez envoyé la demande ne répond pas dans le délai que vous avez défini, vous obtenez TimeoutException.

Pour éviter cette erreur, vous pouvez augmenter les délais. Cependant, ils sont assez gros par défaut, donc il est peu probable que l'augmentation aide. Vous pouvez essayer plusieurs fois. Si cela ne vous aide pas, le serveur est probablement en panne.

504 Délai d'expiration de la passerelle est un serveur erreur. Cela est généralement dû à des erreurs ou à une surcharge de l'infrastructure du serveur à laquelle vous avez envoyé des demandes. C'est une boîte noire pour vous.

Vous ne pouvez rien faire à propos de cette erreur, seuls les administrateurs de serveur peuvent résoudre ce problème. Si l'erreur est provoquée par une surcharge, vous pouvez essayer plusieurs fois, mais le faire trop souvent fera plus de mal que de bien, évidemment.

En général, si vous n'obtenez pas de code HTTP, c'est une exception de .NET. Si vous obtenez un code HTTP, vous pouvez regarder le premier chiffre:

2**OK
3**Redirection
4** Client error
5** Server error

16
Athari

Vous pouvez consulter ce lien Pour "L’opération a expiré" et le problème peut être dû au fait que le serveur est déjà occupé par une tâche. un serveur n'a pas reçu de réponse rapide d'un autre serveur auquel il était en train d'accéder en essayant de charger la page Web ou de remplir une autre demande du navigateur.

3
Sumit

L'opération a expiré Se produit lorsqu'une heure spécifiée est définie et que le serveur n'est pas en mesure de répondre à cette heure particulière (se produit à l'intérieur du serveur distant)

tandis que 

504 erreurs dans le cycle HTTP (se produit lors de la communication entre le client et le serveur) Tout client (votre navigateur Web ou notre robot CheckUpDown, par exemple) exécute le cycle suivant. lorsqu'il communique avec le serveur Web:

Obtenez une adresse IP à partir du nom IP du site (l'URL du site sans le 'http: //' qui précède). Cette recherche (conversion du nom IP en adresse IP) est fournie par les serveurs de noms de domaine (DNS). Ouvrez une connexion de socket IP à cette adresse IP. Écrivez un flux de données HTTP via ce socket. En réponse, recevez un flux de données HTTP du serveur Web. Ce flux de données contient des codes d'état dont les valeurs sont déterminées par le protocole HTTP. Analyser ce flux de données pour rechercher les codes d’état et d’autres informations utiles. Cette erreur se produit lors de la dernière étape ci-dessus lorsque le client reçoit un code d’état HTTP qu’il reconnaît comme «504». (Dernière mise à jour: mars 2012).

Correction des erreurs 504 - général

Ce problème est entièrement dû à la lenteur de la communication IP entre les ordinateurs principaux, y compris éventuellement le serveur Web. Seules les personnes ayant configuré le réseau sur le site hébergeant le serveur Web peuvent résoudre ce problème.

0
Ajay Kumar