web-dev-qa-db-fra.com

Traitement du délai d'attente HttpWebRequest

J'ai une question très simple. Je télécharge des fichiers sur un serveur à l'aide de HTTP POST. Le problème, c’est que j’ai besoin de gérer spécialement les délais de connexion et d’ajouter un peu d’algorithme d’attente après un délai donné pour revivre le serveur.

Mon code est assez simple: 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("SomeURI");
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.KeepAlive = true;
request.Accept = "*/*";
request.Timeout = 300000;
request.AllowWriteStreamBuffering = false;

try
{
      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
      {
            WebHeaderCollection headers = response.Headers;    
            using (Stream Answer = response.GetResponseStream())
            {
                // Handle.
            }
      }
}
catch (WebException e)
{
    if (Timeout_exception)
    {
       //Handle timeout exception
    }
}

J'ai omis le code de lecture de fichier car cela ne nous concerne pas. Maintenant, je dois m'assurer qu'une fois qu'une exception WebException est générée, je filtre l'exception pour voir s'il s'agit bien d'une exception de délai d'attente. J'ai pensé comparer avec le message d'exception, mais je ne suis pas sûr que ce soit la bonne façon, car l'application en question est une application commerciale et je crains que le message varie d'une langue à l'autre. Et quel message devrais-je rechercher?.

Aucune suggestion?

23
Zaid Amir

Vous pouvez regarder WebException.Status . L'énumération WebExceptionStatus a un indicateur Timeout:

try
{
   using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
   {
      WebHeaderCollection headers = response.Headers;    
      using (Stream answer = response.GetResponseStream())
      {
          // Do stuff
      }
   }
}
catch (WebException e)
{
   if (e.Status == WebExceptionStatus.Timeout)
   {
      // Handle timeout exception
   }
   else throw;
}

L'utilisation de filtres d'exception C # 6 peut être utile ici:

try
{
    var request = WebRequest.Create("http://www.google.com");
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        WebHeaderCollection headers = response.Headers;
        using (Stream answer = response.GetResponseStream())
        {
            // Do stuff
        }
    }
}
catch (WebException e) when (e.Status == WebExceptionStatus.Timeout)
{
    // If we got here, it was a timeout exception.
}
38
Yuval Itzchakov

La réponse de Yuval est assez directe, mais voici une version de la mienne que j'ai essayée depuis que je subis dans les mêmes circonstances si vous voulez cibler via des codes d'état:

catch (WebException ex)
            {
                var hwr = (HttpWebResponse)ex.Response;
                if (hwr != null)
                {
                    var responseex = hwr.StatusCode;
                    int statcode = (int)responseex;
                    if (statcode == 404)
                    {
                        Utility.Instance.log(logPath, "The file might not be availble yet at the moment. Please try again later or contact your system administrator.", true);
                    }
                    if (statcode == 401)
                    {
                        Utility.Instance.log(logPath, "Username and Password do not match.", true);
                    }
                    if (statcode == 408)
                    {
                        Utility.Instance.log(logPath, "The operation has timed out", true);
                    }
                }
                else
                {
                    Utility.Instance.log(logPath, ex + ". Please contact your administrator.", true);//Or you can do a different thing here
                }
            }
0
OneLazy