Laden...

Wie die Verfügbarkeit eines HTTP(S) Servers ohne die verwendung der Ping-Klasse prüfen?

Erstellt von Chronos vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.414 Views
C
Chronos Themenstarter:in
132 Beiträge seit 2008
vor 10 Jahren
Wie die Verfügbarkeit eines HTTP(S) Servers ohne die verwendung der Ping-Klasse prüfen?

[Targetframework: .Net 4.0]

Hallo,

ich schreibe gerade eine Anwendung welche es notwendig macht HTTP bzw. HTTPS Server auf ihre Verfügbarkeit zu überwachen.

Zu diesem zwecke, habe ich eine Liste von URI's, wo jede URI den zu überwachenden Server repräsentiert.

Mittels eines Timers, lasse ich zu einem Bestimmten Intervall automatisch über alle Uris loopen.

In der Loop soll dann die Überprüfung auf die Erreichbarkeit der URI erfolgen.

An und für sich ist das ja kein Problem, denn wofür gibt's die Klasse Ping mit deren Hilfe ich einen Ping an den angegebenen Host senden kann.

Rein von der Logik könnte ich jetzt hinter dieses Problem nen dicken fetten Hacken dran machen ABER... ^^

Das Problem taucht während des Debuggens auf.
Genauer gesagt wenn ich den Debugprozess abbreche während meine Loop noch damit beschäftigt ist die Server anzupingen.
Das Ergebnis des Abbruchs ist ein Bluescreen welcher mir die Fehlermeldung "Process_has_locked_Pages" präsentiert.

Ein bisl Googlen ergab, dass da wohl seitens des .Net Frameworks was nicht stimmt.

Jedenfalls suche ich jetzt nach einer anderen Lösung für mein Problem. Sprich ohne die Klasse Ping zu nutzen. Denn ständig nen Bluescreen ist für mich nicht wirklich was schönes 😄

Hin und wieder las ich was darüber den Timeout-Parameter der Methode Send unter 500 zu setzen damit das Problem nicht auftritt. Leider konnte ich diese Erfahrung nicht machen und halte damit so es denn funktioniert hätte nicht für eine Lösung sondern für eine Verschiebung des Problems.

Hier noch meine Ping-Methode wie sie derzeit implementiert ist:



public bool Ping()
        {
            if (Uri == null)
            { return false; }

            try
            {
                System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
                System.Net.NetworkInformation.PingReply pingReply = ping.Send(Uri.Host, 500);
                return (pingReply.Status == System.Net.NetworkInformation.IPStatus.Success);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                return false;
            }

        }


T
2.222 Beiträge seit 2008
vor 10 Jahren

Mach auf eine vorhandene Seite einen WebRequest und hol die per GetResponse den WebResponse.
Wenn du diesen nicht bekommst dann weißt du eben das das Web nicht erreichbar ist.

Nachtrag:
Ping scheint mir heir auch der falsche Ansatz zu sein.
Damit pingst du eigentlich den Host aber nicht das Web an oder?

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
269 Beiträge seit 2010
vor 10 Jahren

Ein Ping würde ausreichen, um zu prüfen, ob der Server erreichbar wäre... dabei ist jedoch zu beachten, dass es sich hierbei nur um die "physische Instanz" des Servers handelt, also den eigentlichen Rechner.
Um zu prüfen, ob ein HTTP(S) Server erreichbar ist, müsste man auch auf entsprechenden Ports anfragen... es besteht immerhin die Möglichkeit, dass die entsprechende Server-Software gerade nicht läuft oder nicht reagiert.

Ich würde daher dem Ansatz von T-Virus folgen.
Der HttpWebRequest mag hier eine Möglichkeit sein, kann aber u.U. auf den Traffic gehen (und somit mehr Zeit in Anspruch nehmen als nötig), wenn die Seite viel zurücksendet. Verringern ließe sich die Antwort des Servers, wenn man anstatt eines GET ein HEAD Request sendet.

M
184 Beiträge seit 2012
vor 10 Jahren

Reicht es nicht aus, einfach eine TCP-Verbindung (Sockets) über Port 80 (oder ggf. einen anderen Port) aufzubauen?
Kann die Verbindung aufgebaut werden > Server ist erreichbar
Läuft die Verbindung in einen Timeout > Server ist nicht erreichbar

So kann man sich den ganzen Traffic sparen.
Man kann so allerdings nicht sicher feststellen, ob auf Port 80 nicht zufällig irgendein anderer TCP-Server läuft... Aber normalerweise ist Port 80 für HTTP reserviert.

799 Beiträge seit 2007
vor 10 Jahren

Reicht es nicht aus, einfach eine TCP-Verbindung (Sockets) über Port 80 (oder ggf. einen anderen Port) aufzubauen?

Wenn du sowieso nur Ping verwenden wolltest - was ich nicht tun würde, denn die Ping-ICMP-Message muss ja nicht frei geschalten sein - ist der Ansatz mit TCP auf Port 80 bzw. 443 wohl der beste. Schnell und die Funktionalität kann im Zweifelsfall mit netcat nachgeprüft werden.

Um zu prüfen, ob ein HTTP(S) Server erreichbar ist, müsste man auch auf entsprechenden Ports anfragen... es besteht immerhin die Möglichkeit, dass die entsprechende Server-Software gerade nicht läuft oder nicht reagiert.

Da hat Karill Endusa schon einen guten Punkt. Wäre Nagios nicht einer selbst entwickelten Lösung vorzuziehen?

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl