2017-12-05 1 views
-5

Ich möchte in meiner kleinen GUI anzeigen, ob die Website online oder offline ist. Mein tatsächlicher Code kann überprüfen, ob eine Website online ist, und dies wird in der Schriftfarbe grün angezeigt, aber wenn eine Website offline ist, stürzt meine GUI ab. HierErmitteln, ob die Website online ist

ist der Code:

private void button1_Click(object sender, EventArgs e) 
{ 
    HttpWebRequest Movie2kStatus = (HttpWebRequest)WebRequest.Create("https://www.xxxxxxx.sh"); 
    Movie2kStatus.AllowAutoRedirect = false; 
    prgb_Status.Value = 15; 
    HttpWebRequest Movie4kStatus = (HttpWebRequest)WebRequest.Create("https://www.xxxxxxxxxx.tv"); 
    Movie4kStatus.AllowAutoRedirect = false; 
    prgb_Status.Value = 20; 
    HttpWebRequest FreestreamStatus = (HttpWebRequest)WebRequest.Create("https://xxxxxxxx.to/de/"); 
    FreestreamStatus.AllowAutoRedirect = false; 
    prgb_Status.Value = 35; 
    HttpWebRequest OpenloadStatus = (HttpWebRequest)WebRequest.Create("https://www.xxxxx.co"); 
    Movie2kStatus.AllowAutoRedirect = false; 
    prgb_Status.Value = 40; 
    HttpWebRequest DatenbankStatus = (HttpWebRequest)WebRequest.Create("http:///www.xxxx.de"); 
    Movie2kStatus.AllowAutoRedirect = false; 
    prgb_Status.Value = 55; 

    HttpWebResponse httpRes1 = (HttpWebResponse)Movie2kStatus.GetResponse(); 
    prgb_Status.Value = 60; 
    HttpWebResponse httpRes2 = (HttpWebResponse)Movie4kStatus.GetResponse(); 
    prgb_Status.Value = 75; 
    HttpWebResponse httpRes3 = (HttpWebResponse)FreestreamStatus.GetResponse(); 
    prgb_Status.Value = 80; 
    HttpWebResponse httpRes4 = (HttpWebResponse)OpenloadStatus.GetResponse(); 
    prgb_Status.Value = 95; 
    HttpWebResponse httpRes5 = 
      (HttpWebResponse)DatenbankStatus.GetResponse(); // <--- CRASH 


    if (httpRes1.StatusCode == HttpStatusCode.OK) 
    { 
     lbl_StatusMovie2k.ForeColor = Color.Green; 
     tbx_StatusMovie2K.ForeColor = Color.Green; 
     tbx_StatusMovie2K.Text = "Online"; 
    } 
    else 
    { 
     lbl_StatusMovie2k.ForeColor = Color.Red; 
     tbx_StatusMovie2K.ForeColor = Color.Red; 
     tbx_StatusMovie2K.Text = "Offline"; 
    } 

    httpRes1.Close(); 


    if (httpRes2.StatusCode == HttpStatusCode.OK) 
    { 
     lbl_StatusMovie4K.ForeColor = Color.Green; 
     tbx_StatusMovie4K.ForeColor = Color.Green; 
     tbx_StatusMovie4K.Text = "Online !"; 
    } 
    else 
    { 
     lbl_StatusMovie4K.ForeColor = Color.Red; 
     tbx_StatusMovie4K.ForeColor = Color.Red; 
     tbx_StatusMovie4K.Text = "Offline !"; 
    } 

    httpRes2.Close(); 

    if (httpRes3.StatusCode == HttpStatusCode.OK) 
    { 
     lbl_StatusFreestream.ForeColor = Color.Green; 
     tbx_StatusFreestream.ForeColor = Color.Green; 
     tbx_StatusFreestream.Text = "Online !"; 
    } 
    else 
    { 
     lbl_StatusFreestream.ForeColor = Color.Red; 
     tbx_StatusFreestream.ForeColor = Color.Red; 
     tbx_StatusFreestream.Text = "Offline !"; 
    } 

    httpRes3.Close(); 

    if (httpRes4.StatusCode == HttpStatusCode.OK) 
    { 
     lbl_StatusOpenload.ForeColor = Color.Green; 
     tbx_StatusOpenload.ForeColor = Color.Green; 
     tbx_StatusOpenload.Text = "Online !"; 
    } 
    else 
    { 
     lbl_StatusOpenload.ForeColor = Color.Red; 
     tbx_StatusOpenload.ForeColor = Color.Red; 
     tbx_StatusOpenload.Text = "Offline !"; 
    } 

    httpRes4.Close(); 

    if (httpRes5.StatusCode == HttpStatusCode.OK) 
    { 
     lbl_StatusDatenbank.ForeColor = Color.Green; 
     tbx_StatusDatenbank.ForeColor = Color.Green; 
     tbx_StatusDatenbank.Text = "Online !"; 
    } 
    if (httpRes5.StatusCode == HttpStatusCode.Unauthorized || httpRes5.StatusCode == HttpStatusCode.ServiceUnavailable) 
    { 
     lbl_StatusDatenbank.ForeColor = Color.Red; 
     tbx_StatusDatenbank.ForeColor = Color.Red; 
     tbx_StatusDatenbank.Text = "Offline !"; 
    } 
    prgb_Status.Value = 100; 

    httpRes5.Close(); 
} 
+0

Führen Sie den Aufruf async aus Ihrem UIhread und behandeln Sie einfach das Ergebnis in Ihrem UIhread – Stefan

+1

Alles, was Sie von Ihrem Ende beweisen können ist, ob _you_ kann die Website erreichen, nicht unbedingt, ob es _offline_ – MickyD

+2

Bitte respektieren Sie unsere Zeit und immer minimal Beispiel: Ihr Code kann um fast 70% reduziert werden und enthält immer noch die gleiche fehlerhafte Logik. –

Antwort

0

GetResponse wird eine WebException für bestimmte Reaktionen des implementaton in HttpWebResponse behandelt werfen. Für den Anfang muss man damit umgehen.

In einer Methode ist es einfacher, eine Site zu bearbeiten, die online oder offline ist. Durch Hinzufügen einer weiteren Hilfsmethode können Sie diesen Code ein wenig aufräumen. Ich werde nicht auf die Tatsache eingehen, dass Sie all dies auf dem UI-Thread ausführen und jedes ScreenUpdate blockieren, während die Websites überprüft werden. Es gibt genug Fragen, die dieses Problem ansprechen, und ich überlasse das als Übung für den Leser.

Zuerst wird das Verfahren zu überprüfen, ob eine Site online ist oder nicht:

bool SiteIsOnLine(string url, params HttpStatusCode[] expect) 
{ 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
    req.AllowAutoRedirect = false; 
    try 
    { 
     using(HttpWebResponse res = (HttpWebResponse)req.GetResponse()) 
     { 
      return res.StatusCode == HttpStatusCode.OK; 
     } 
    } 
    catch(WebException webException) 
    { 
     if (webException.Status == WebExceptionStatus.ProtocolError) 
     { 

      using(var res = (HttpWebResponse) webException.Response) 
      { 
       // this is a bit weird but this does mimic what the OP currently has, 
       // worst case return FileNotFound here ... https://thedailywtf.com/articles/What_Is_Truth_0x3f_ 
       return !expect.Any(sc => sc == res.StatusCode); 
      } 
     } 
     return false; 
    } 
} 

Dann wird die Hilfsmethode der UI-Komponenten basierend auf dem Ergebnis des Online-Check für eine einzelne Website:

void HandleSite(string url,Control lbl, Control tbx) 
{ 
    Color color; 
    if (SiteIsOnLine(url, HttpStatusCode.Unauthorized, HttpStatusCode.ServiceUnavailable)) 
    { 
     tbx.Text = "Online"; 
     color = Color.Green; 
    } 
    else 
    { 
    tbx.Text = "Offline"; 
    color = Color.Red; 
    } 
    lbl.ForeColor = color; 
    tbx.ForeColor = color; 
} 

und Ihre Click-Ereignis die Hilfsmethode für jeden Standort und das Etikett und die Textbox, die Sie für diese Website aktualisieren möchten rufen:

void button1_Click(object sender, EventArgs e) 
{ 
    HandleSite("https://www.xxxxxxx.sh", lbl_StatusMovie2k, tbx_StatusMovie2K); 
    HandleSite("https://www.xxxxxxxxxx.tv", lbl_StatusMovie4K, tbx_StatusMovie4K); 
    HandleSite("https://xxxxxxxx.to/de/", lbl_StatusFreestream, tbx_StatusFreestream); 
    HandleSite("https://www.xxxxx.co", lbl_StatusOpenload, tbx_StatusOpenload); 
    HandleSite("http:///www.xxxx.de", lbl_StatusDatenbank, tbx_StatusDatenbank); 
} 
+0

Ich möchte es heute ausprobieren, danke fürs Zeigen! ;) Ich antworte ob es funktioniert oder nicht;) –

Verwandte Themen