Laden...

Wie entwickle ich am Besten ein Tool, das die Verbindung zum Application-Server prüft?

Erstellt von eMsentry vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.326 Views
E
eMsentry Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren
Wie entwickle ich am Besten ein Tool, das die Verbindung zum Application-Server prüft?

Hallo,

ich bin recht neu in C# und wollte euch Fragen bezüglich eines kleineren Tools stellen.

Unzwar möchte ich ein Tool erstellen, welches man von beliebigen Standorten (z. B. bei Kunden) mittels einen überreichten Connection-Strings ausführen kann.
Ich möchte quasi vorab herausfinden, ob die Verbindung von einem jeweiligen Standort (Rechner) auf einen bestimmten Application Server möglich ist.
Oftmals kam es nämlich vor, das die Verbindung wegen blockierter Ports oder sonstiges nicht möglich war.

Nun wollte ich mich, bevor ich mich ins getümmel stürze, ersteinmal informieren wie ich da am besten vorgehe?

Vielen Dank & bleibt Gesund!

6.911 Beiträge seit 2009
vor 3 Jahren

Hallo eMsentry,

führe einfach eine Dummy-Abfrage zum Application-Server durch.
Wenn du den Server auch beeinflussen kannst, so z.B. eine "Hallo"-Abfrage, die vom Server die Zeit zurückgibt, etc.
So kannst du prüfen ob die Verbindung passt und auch ob die Authentifizierung / Autorisierung soweit OK ist.

wegen blockierter Ports oder sonstiges nicht möglich war

Für so einen Zweck macht das sinn. Generell sind solche Tests aber mit Vorsicht zu genießen, da zwischen Test, der OK liefert, und späterer Verwendung viel passieren kann. D.h. im Betrieb kann einfach der Reqeust zum Server abgefeuert werden und falls es ein Problem gibt via Exception-Handling darauf reagieren, z.B. indem ein neuer Versuch nach kurzer Wartezeit durchgeführt wird (siehe dazu Polly).

Auch interessant in diesem Zusammenhang: Health checks in ASP.NET Core

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

301 Beiträge seit 2009
vor 3 Jahren

Eine wichtige Frage wäre was für eine Art Verbindung du testen möchtest. Als einfachste Methode gilt hier eigentlich ein Ping auf den Server. Wenn du das für bestimmte Ports benötigst hilft dir ggf. dieser Stackoverflow post Ping a Specific Port

Hinweis von gfoidl vor 3 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 3.1

P
57 Beiträge seit 2017
vor 3 Jahren

Das hängt von so vielen Faktoren ab....

Welche Verbindung steht? (VPN, ist die DB per WebService oder direkt erreichbar?)

Ein Ping ist nur dann Sinnvoll wenn man sicherstellen kann, dass die Firewall das ICMP Protokoll und damit in Verbindung gesetzt auch Pings durchlässt und darauf antwortet.

.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....

E
eMsentry Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren

Hallo,
erstmal danke für eure Hilfe.

Ich habe mich jetzt intensiver mit dem Thema beschäftigt und wollte euch als Programmierneuling mal Fragen was ihr vom bisherigen Stand hält


using Independentsoft.Webdav;
using System;
using System.Data.SqlClient;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;


namespace ConnectionCheck
{
    public class ConnectionType
    {
        setColor messageColor = new setColor();

        string SQLConnectionString = "";
        string WebDAVfileUrl = "";
        string webAPIbaseadd = "";
        string webAPIresponse = "";

        public void sqlServer()
        {
            SqlConnection cnn = new SqlConnection();
            cnn.ConnectionString = SQLConnectionString;

            try
            {
                cnn.Open();
                cnn.Close();
                messageColor.Green("SQL | Verbindung konnte hergestellt werden.");
            }
            catch (SqlException ex)
            {
                if (ex.Message.Contains("Netzwerkbezogener oder instanzspezifischer Fehler"))
                    messageColor.Red("SQL | Bitte öffnen Sie die den TCP-Port 1433 und UDP-Port 1434.");
                else
                    messageColor.Red("SQL | Verbindung konnte nicht hergestellt werden.");
            }
            catch (Exception ex)
            {
                messageColor.Red(ex.Message);
            }
        }

        public void webDAV()
        {
            NetworkCredential credential = new NetworkCredential("username", "password");
            WebdavSession session = new WebdavSession(credential);
            Resource resource = new Resource(session);

            try
            {
                bool exist = resource.Exists(WebDAVfileUrl);

                if (exist)
                    messageColor.Green("WEBDAV | Verbindung konnte hergestellt werden.");
                else
                    messageColor.Red("WEBDAV | Fehlerhafte URL oder Login-Credentials.");
            }
            catch (WebException ex)
            {
                if (ex.Message.Contains("Die Verbindung mit dem Remoteserver kann nicht hergestellt werden."))
                    messageColor.Red("WEBDAV | Bitte öffnen Sie die den TCP-Port 444.");
                else
                    messageColor.Red("WEBDAV | Fehlerhafte URL oder Login-Credentials.");
            }
            catch (Exception ex)
            {
                messageColor.Red(ex.Message);
            }
        }

        async Task webApiAsync()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(webAPIbaseadd);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                try
                {
                    HttpResponseMessage response = await client.GetAsync(webAPIresponse);
                    if (response.IsSuccessStatusCode)
                        messageColor.Green("API | Verbindung konnte hergestellt werden.");
                    else
                        messageColor.Red("API | Fehlerhafte URL");
                }
                catch (HttpRequestException ex)
                {
                    if (ex.Message.Contains("Fehler beim Senden der Anforderung."))
                        messageColor.Red("API | Bitte öffnen Sie die den TCP-Port 19081.");
                    else
                        messageColor.Red("API | Verbindung konnte nicht hergestellt werden.");
                }
                catch (Exception ex)
                {
                    messageColor.Red(ex.Message);
                }
            }
        }

        public void webApi()
        {
            webApiAsync();
        }
    }
}

Mir wurde gesagt ich soll die Anwendung so konzipieren,
dass man die Verbindungstest via Button einer WindowsForm ausführen kann und der Nutzer quasi über die Form die Textausgaben bekommt,
und zusätzlich manuell über die Console - also die Anwendung soll nicht 'Form'-abhängig sein.

Außerdem soll ich jede Funktion asynchron machen damit die Anwendung später nicht einfriert (?)

Allgemein würde mich auch interessieren wo ihr die Probleme im Code seht und ob ihr den ein oder anderen tipp für mich habt.

Ich danke euch und bleibt Gesund 😃

P
441 Beiträge seit 2014
vor 3 Jahren

Sofern die Verbindungstests deinen Anforderungen genügen und funktionieren kann man das so machen.

Allerdings solltest du das wie du es machst noch einmal überarbeiten.
-> Trenne Logik von UI [Artikel] Drei-Schichten-Architektur
-> Beim prüfen von Exception Strings bedenke, dass diese nur bei dir auf Deutsch sein könnten. Bei jemanden mit einem englischen Sprachpaket (OS) sind diese auf Englisch
-> Nutze keine "Magic Strings" zum kommunizieren, das ist UI Aufgabe, nicht Logik. Das lässt sich so z.B. nicht lokalisieren. Nutze z.B. Enums oder Ereignisbasierte "Benachrichtigungen"
-> Methoden können Rückgabewerte haben, dadurch kannst du dann später Wiederverwendbarkeit steigern.

Ich hätte vermutlich ein Interface definiert IConnectionTester o.ä. und dann davon drei Implementierungen bereit gestellt, je eine für SQL, WebDav und HTTP.
Denn die Intention und die Rückgabe sind exakt diegleichen, nur die Transportverbindung nicht. Damit hättest du es auch später einfacher, wenn du weitere Dienste testen willst (z.B. FTP oder SSH, ...)

P
57 Beiträge seit 2017
vor 3 Jahren

Ich würde die Credentials nicht im Sourcecode bereitstellen sondern aus Einstellungen lesen - Username und Password nach Möglichkeit verschlüsselt.

.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....