??? nach meiner Antwort hast du mich per PN angeschrieben und ich habe dir eine ausführliche Antwort geschickt (die ich hier in Kurzform ergänzt habe)... was funktioniert daran nicht?
Zitat von PN
From - Sun, 22 Dec 2019 15:47:18
Date: Sun, 22 Dec 2019 16:47:18 +0100
From: "Papst" <[email protected]>
To: "joob" <[email protected]>
Subject: RE: request - Verständnisproblem
Hi,
du kannst das gerne auch einfach in deinem Thread schreiben :)
Wenn man synchron und async/await mischt, ist das etwas tricky.
Für WebClient habe ich gerade einfach mal debugged... was du suchst steht in der Response, du musst sie lesen:
using (StreamReader reader = new StreamReader(ex.Response.GetResponseStream()))
{
reader.ReadToEnd().Dump();
}
Synchron mit HttpClient arbeiten kannst du so:
HttpClient cl = new HttpClient();
var result = cl.PostAsync("", new StringContent("...")).GetAwaiter().GetResult();
Beim Debugging konnte ich nichts herausfinden.
innerexception war aber leer.
Die Fehlermeldung kommt auch aus einer Exception, ich dachte aber vielleicht ist dort was zu finden.
Ansonsten ist die generelle Empfehlung HttpClient anstatt von WebClient zu nutzen - das würde an der Fehlerbehandlung und am Debugging aber nichts ändern :)
Edit: Nach PN Diskussion, um es hier zu teilen:
Die Antwort steht nicht in der InnerException, sondern in der Response Property der WebException.
Die Antwort auf deine erste Frage ist:
--> Mit einer passenden Architektur.
Eine Klassenbibliothek sollte nicht auf das GUI durchgreifen. Stell dir vor, du würdest eine Bibliothek von irgendjemand anderem einsetzen und würde deren Funktionalität nutzen. Wenn jetzt ein bestimmtes Ereignis eintritt zeigt die Bibliothek eine Messagebox an, ohne dass du das ändern kannst.
Im Forum gibt es einen Artikel und FAQ Bereich, hieraus würde ich dir die folgenden zwei Artikel empfehlen: [Artikel] Drei-Schichten-Architektur [FAQ] Kommunikation von 2 Forms
Der erste zeigt eine solche Architektur, der zweite wie man prinzipiell mit soetwas umgehen kann. Nur dass hier keine zweite Form im Einsatz ist, sondern eine Bibliothek.
Sorry, wenn ich mich hier von der Seite so einmische, ich mag das aber nicht so stehen lassen.
Ihr sprecht von echtzeit und schnell - das sehe ich immer und an jeder Stelle, es ist aber schlicht falsch.
Die Definition von Echtzeit ist nicht schnell, sondern deterministisch mit einem bestimmten, zum Ende hin beschränkten Zeitfenster für eine/jede Operation (weiche Echtzeit; maximale Zeit für eine bestimmte Operation oder Zyklus) oder einem auf beiden Seiten beschränkten Zeitfenster für eine Operation oder Zyklus (harte Echtzeit).
Ich sehe das auch bei unseren Kunden immer wieder, dass schnell mit Echtzeit gleichgesetzt wird und muss dann immer die Schleife über die Anforderungen an das Zeitverhalten drehen :)
Eine GUI kann durchaus Echtzeitanforderungen haben, vor allem dann, wenn man GUI als Abstraktes Gebilde (als HMI) sieht und z.B. einen Leuchtmelder auch dazu zählt, der z.B. einen Fehler signalisiert.
Wenn du eine neue Applikation anfängst oder eine alte modernisierst, solltest du nicht mehr über WCF nachdenken.
Hier gibt es moderne Ansätze durch ASP.NET Core Web API (oder Technologieneutral REST API), Graph QL, ODATA oder auch gRPC, je nachdem was für deinen Anwendungsfalls das beste ist.
Die Idee von AppInsights und Nagios/PRTG sind gänzlich unterschiedlich.
Während AppInsights die Telemetrie von Webseiten loggt und tiefere Insights bietet, sind Nagios (Open Source) und PRTG (free für kleine Workloads; 100 Datenpunkte glaube ich) mehr eine Art HealthCheck Service, diese pingen also die die Webseite in regelmäßigen Zeitabständen und geben dann weniger Insights.
Putty ist lediglich ein Werkzeug, dass es dir erlaubt über eine SSH Verbindung eine Shell auf einem Remote PC zu öffnen.
Weder Putty, noch eine Shell via SSH ist für eine Automatisierung sonderlich geeignet.
Wenn du nicht ohne den SQL Server kannst (z.B. weil die Dateneingangsschnittstelle fest steht) und es wirklich nicht anders geht (z.B. über REST entkoppeln), solltest du trotzdem von dem ERP System aus auf ein anderes System zugreifen... und wenn nachher vom ERP System aus eine Anwendung alle 5 Minuten eine Tabelle im SQL pollt ist das immer noch besser, als vom SQL Server aus eine SSH Verbindung zum ERP aufzubauen.
Was dir klar sein muss: Du bist immer von diesen Servern abhängig, das skaliert unglaublich schlecht und du wirst diese Schnittstelle bei z.B. einem ERP Upgrade pflegen müssen.
Meine Empfehlung wäre ganz klar mit dem Hersteller des ERP Systems zu sprechen. Mit etwas Glück habt ihr einen Wartungsvertrag und man kann darüber vielleicht eine saubere Lösung implementieren.
Auf einen FTP Server greifst du nicht zu wie auf das lokale Dateisystem, dazu musst du das FTP Protokoll benutzen. Hierfür gibt es verschiedene Implementierungen in .NET / .NET Core.
Wenn ich FTP verwenden muss, dann nehme ich meist die Bibliothek FluentFTP.
In dem obj Ordner solltest du eigentlich nichts starten.
Mit den Standardeinstellungen findest du die kompilierte Anwendung in bin\Release oder bin\Debug und wenn du diese dort bewegen willst brauchst du auch nur den Inhalt dieser Ordner kopieren.
Vom Prinzip solltest du eine echte Klasse erstellen und diese aus dem Body lesen lassen.
Ist das Model dann nicht valide wird die MVC Middleware von sich aus 404 (vermute ich) senden, weil keine passende Route gefunden wurde.
Reflection würde ich niemals (manuell) da verwenden, wo es sich vermeiden lässt.
mach es dir nicht zu schwer. Es gibt bereits fertige Frameworks und Protokolle, die genau das bieten.
In der Regel ist es weder ratsam noch notwendig ein eigenes Protokoll zu entwickeln (Selbstschulung und Verständnis ausgenommen).
Je nachdem, was du vorhast würde sich gRPC (mit .NET Core 3.0) oder z.B. auch MQTT anbieten.
-> Initialisiere die Semaphore mit einem Counter, der deiner Anzahl threads enspricht.
-> Jeder Thread der schreiben will holt sich eine Semaphore und gibt sie nach jeder Operation wieder frei
-> Will ein Thread exklusiv Zugriff, holt er sich einfach alle
Hyper-V ist aktiv und der SPS-Kontroller läuft.
Wenn ich dann Docker starte, sagt er mir, das Hyper-V nicht aktiv wäre, ist es aber.
Das kann so nicht passen. Docker CE für Windows ist durchaus in der Lage sich ein aktives Hyper-V mit anderen VM's zu teilen.
Mache ich auf meinem Entwicklungsrechner genauso.
-> Ist Hyper-V aktiv, wenn du unter Systemsteuerung > Programme > Optionale Windows Features schaust oder nutzt die SPS nicht Hyper-V sondern einen anderen Hypervisor?
Alternativ, aber hacky:
Eine Linux VM im aktiven Hypervisor installieren und dort Docker nutzen.
HTTP Kommunikation funktioniert so nicht. Ein HttpRequest ist an einem bestimmten Zeitpunkt abgeschlossen.
Du müsstest das Senden der Antwort entsprechend verzögern, bis deine Berechnung durchlaufen ist. Genau dafür gibt es das async/await Pattern.
Allerdings darf es dafür auch nicht zulange dauern, denn irgendwann bricht der Client (idr. ja Browser) ab, wenn keine Antwort kommt.
P.S.: Bitte nutze die C#-Code Tags, dann kann man den Code auch gut lesen.
Der Name der Klasse deines Form, bei dem du OnPaint überschreibst, ist Program. Zumindest nach dem Codeschnipsel dort.
Du erstellst allerdings eine Instanz der Klasse Form:
Application.Run(new Form());
Edit:
Richtiger wäre: Eine neue Klasse (form) zu erzeugen, diese LabyrinthForm zu nennen und darin OnPain zu überschreiben. Danach erzeugst du dann in der Zeile mit Application.Run dein neues Form.
Im einfachsten Fall: Der Dienst startet auch nur eine .exe, die sich an ein entsprechendes Muster hält.
Wenn du die .exe austauschst, wird die neue gestartet.
Dafür muss der Dienst natürlich beendet sein.
Ansonsten, wenn du dir unsicher bist würde ich einfach eine Beispielinstallation machen und es ausprobieren. Wesentlich sicherer, als ein Kommentar aus einem Forum :)
oder natürlich nach einer Doku suchen.
Die Lib funktioniert eigentlich sehr gut - wenn man einmal den Einstieg gefunden hat - ich habe damit auch schon eine kleine Software umgesetzt.
Ich würde hier unterstellen, dass es ggf. an deinem Rechner liegt. Sachen die ich testen würde:
Starte zum Debuggen einmal VS als Administrator (hilft ggf. bei dem Port unter Windows)
Nutze Wireshark um zu schauen ob dir das Gerät, dass du ansprichst antwortet, wenn du nichts siehst, nutze Wireshark auf einem anderen Rechner, indem du auf einem zwischengelagerten Switch Port Mirroring aktivierst und so alle Pakete mitschneiden kannst
Schau, ob du mit einer anderen SNMP Software die GetBulkRequest Operation an deinem Endgerät ausführen kannst - vielleicht ist das dort einfach nicht richtig implementiert
was genau möchtest du haben? Das "Verbindung aufbauen" Fenster von SQL Management Studio?
Vermutlich wirst du dir das nachbauen müssen - ausser du findest für deine verwendete UI Technologie eine Bibliothek, die dir das Fenster liefert.
Abgesehen davon ist es meistens keine gute Idee eine (Desktop-)Client Applikation direkt auf eine Datenbank zugreifen zu lassen. Sinnvoll ist es hier einen Service zwischen zu schalten, alleine schon weil du die Rechte dann granularer nutzen kannst.
Das liegt am Unterschied zwischen Verbindungslosem und Verbindungsorientiertem Protokoll.
UDP ist generell ein Verbindungsloses Protokoll (heißt, es existiert keine logische Verbindung zwischen zwei Sockets) und wenn du sendest ist es dir egal, ob es jemand am anderen Ende liest - das bekommst du einfach nicht mit.
Deswegen kann man mit einem UDPClient einfach auch dauernd an andere Endpunkte senden.
Mit einem TCPClient geht das nicht, denn der braucht immer erst eine Verbindung.