wake-up-neo.net

HttpWebRequest Timeout-Behandlung

Ich habe eine wirklich einfache Frage. Ich lade Dateien mit HTTP POST auf einen Server hoch. Die Sache ist, ich muss speziell Verbindungs-Timeouts behandeln und ein bisschen eines Wartealgorithmus hinzufügen, nachdem ein Timeout aufgetreten ist, um den Server neu zu erleben.

Mein Code ist ziemlich einfach: 

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

Ich habe den Code zum Lesen von Dateien weggelassen, da er uns nicht interessiert. Jetzt muss ich sicherstellen, dass nach Auslösen einer WebException die Ausnahme gefiltert wird, um zu sehen, ob es sich tatsächlich um eine Timeout-Ausnahme handelt. Ich dachte an einen Vergleich mit der Ausnahmemeldung, bin aber nicht sicher, ob dies der richtige Weg ist, da es sich bei der fraglichen Anwendung um eine kommerzielle App handelt und ich befürchte, dass die Meldung zwischen den verschiedenen Sprachen variiert. Und nach welcher Botschaft soll ich suchen?.

Irgendwelche Vorschläge?

23
Zaid Amir

Sie können nach WebException.Status schauen. Das WebExceptionStatus-Enum hat ein Timeout-Flag:

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

Die Verwendung von C # 6-Ausnahmefiltern kann hier hilfreich sein:

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

Die Antwort von Yuval ist ziemlich direkt, aber hier ist eine Version von mir, die ich ausprobiert habe, da ich mich unter denselben Umständen befand, wenn Sie über Statuscodes zielen möchten:

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