![]() |
Dateien von einem virtuellen Server holen
Ich habe eine Anwendung, die Daten visualisiert. Dazu werden Dateien ausgelesen, die sich im Moment auf demselben Rechner befinden.
Dies soll geändert werden, damit man den Speicherort der Dateien nicht direkt sieht. Laut meiner IT soll ich ein Programm schreiben, welches dann als Dienst auf einer VM läuft und die Daten dem Hauptrogramm zur Verfügung stellt. Hier nochmals ein wenig detaillierter. Ich habe einen Rechner 1, der die Daten visualisiert, die der Dienst auf dem 2. Rechner bereitstellen könnte. Die Datei, die bereitgestellt wird, ist zwischen 10 und 20 MB groß. Nun müsste wahrscheinlich der Rechner 1 über ein Protokoll (welches?) die Daten beim Rechner 2 (VM) anfragen und der Rechner 2 müsste diese an Rechner 1 übertragen oder irgendwie bereitstellen, damit der Rechner 1 diese abholen kann. Leider habe ich mit Diensten und der Übertragung von Dateien noch nicht gearbeitet. Wie könnte man so etwas programmieren? |
AW: Dateien von einem virtuellen Server holen
Nja, was für Protokolle du nutzt .... da hast'e die Qual der Wahl.
Bei uns läuft es über DataSnap (mit entsprechenden Methoden, z.B. ReadFile, WriteFile usw.), wo die ServerMethoden das als TStream (TFileStream/TMemoryStream) im Result zurückliefern. Ähnlich DataSnap gibt es auch andere Frameworks, wo man "Funktionen" aufrufen kann und sich das Framework um alles kümmert. (z.B. ![]() Oder ein REST-Server, weil ist hipp, cool und machen alle so (z.B. ID rein und Base64-kodiert im JSON die Datei zurück) Hatte ich jetzt bei uns im DataSnap nachgerüstet, also zusätzlich REST als Protokoll für den Funktionsaufruf, damit auch unsere WebAnwendung auf Dateien zugreifen kann, aber da geht auch jede andere REST-Implementation. (bei uns einfach auf's DataSnap drauf, um im Server das nur einmal implementiert zu haben, aber mit zwei Schnittstellen nach außen) Oder ein richtiges FileProtokol, wie FTP (TIdFTPServer), WebDAV oder Dergleichen. Das kann im Server auch "virtuell" sein und muß nicht direkt auf ein Verzeichnis gehn. Im "Pfad" steht dann quasi die ID/Dateiname/Sonstwas, um die entsprechende Datei/Daten von irgendwo zu holen. Auch ein HTTP-Server (TIdHTTPServer) wäre möglich, ähnlich dem FTP. (Pfad -> Datei) Oder ganz billig TCP/IP (TIdTCPServer), aber hier ist alles "ein" Stream und du mußt dich dann selber um alles kümmern (Authentifizierung, Behandlung der Daten im IN/OUT-Stream, also ID/Pfad übergeben und Dateihinhalt zurück, usw.), also deine Daten entsprechend zu kodieren und drüben wieder einzulesen und womöglich während einer Anfrage mehrer Dateien übertragen. (man könnte aber auch nach jeder Übertragung die Verbindung trennen) Oder ... Aber wenn man ein "ordentliches" Framework genutzt wird, dann nimmt es dir erstmal viel Arbeit ab, und du hast später auch die Möglichkeit das für andere/weitere Dinge zu nutzen, und nicht nur für Dateien. Ob Rechner/Server, VM, Docker oder sonstwo, ist egal. Dein Server wird einfach nur mit der entsprechenden IP oder "ComputerNamen" angesprochen. |
AW: Dateien von einem virtuellen Server holen
Ich bringe mal, wie himitsu, das Open Source Framework mORMot ins Spiel. mORMot ist von D7 bis 10.4 verfügbar. Den Download findest du
![]() ![]() mORMot musst du nicht installierten. Es reicht aus, die entsprechenden Bibliothekspfade einzufügen. Die eigentliche Arbeit ist mit mORMot oft schnell erledigt, das Problem dürfte sein, dich in mORMot einzuarbeiten. Es steht eine ausführliche ![]() ![]() Bei einer neuen Anwendung würde ich mORMot2 empfehlen. Dazu gibt es zur Zeit noch keine Hilfe und auch keine Beispiele. Trotzdem hier der Link zum ![]() Bis bald... Thomas |
AW: Dateien von einem virtuellen Server holen
Zitat:
Ich habe mir einmal einige Beispiele vom HTTPServer (Indy) angeschaut und ein wenig abgewandelt. Erste Tests sind erfolgreich, nur soll ich seitens IT Vorgabe anstelle HTTP dann doch HTTPS nutzen. Das werde ich bestimmt auch noch hinbekommen. |
AW: Dateien von einem virtuellen Server holen
HTTP(S) wäre wohl naheliegend, Millionen Webserver arbeiten so für die Browser / Clients.
Das könnte man auch per Scripting automatisieren / lokal cachen, so dass am Programm vielleicht nur minimal geändert werden muss. Am wichtigsten scheint mir hier die Frage, ob es ein LAN Betrieb ist oder WAN. Und dementsprechend müsste man für eine Authentifizierung des Client sorgen / verhindern, dass jemand die Quelladressen belauscht bzw. einfach so abgreifen kann. Darum scheint es ja zu gehen. HTTPS wäre wahrscheinlich ein Fall für letsEncrypt, wobei das im LAN nicht geht. Oder der Server muss für Einrichtung und Refresh dann von Außen erreichbar sein. |
AW: Dateien von einem virtuellen Server holen
Zitat:
Wegen der Authentifizierung habe ich aber noch keine Erfahrungen. Ich müsste doch im Client irgendwo ein Zertifikat ablegen oder? Zitat:
|
AW: Dateien von einem virtuellen Server holen
Zitat:
Die HTTPS Geschichte kannst Du einfach Deiner IT überlassen, Dich interessieren nur URL, worüber die Dateien abgerufen werden. Wenn es HTTPS sein soll, dann muss die IT das regeln. Dein Server Programm stellt ja erstmal nur über HTTP die Dateien bereit. Je nach Konfiguration liefert der Webserver per HTTP oder HTTPS oder beidem aus. |
AW: Dateien von einem virtuellen Server holen
TIdHTTPServer ist selbst der Webserver.
Aber ja, man kann auch über einen anderen Webserver HTTP/HTTPS laufen lassen und es serverintern ans HTTP des Delphi-Webserver durchreichen. Selbst noch nicht gemacht, aber ich denke mal HTTPS würde so gehn: > TIdHTTPServer.IOHandler und dort z.B. einen TIdServerIOHandlerSSLOpenSSL dran Und falls auch ein Delphi-Client existiert, dann TIdHTTP vermutlich mit TIdSSLIOHandlerSocketOpenSSL. (wie es beim neuen TNetHTTPClient geht, noch weniger Ahnung) Authentication: ![]() * schau mal was TIdHTTPServer.OnParseAuthentication macht * aber spätestens in TIdHTTPServer.OnCommandGet kannst in ARequestInfo nochmal den Username+Passwort der aktuellen Anfrage auslesen/prüfen * bei TIdHTTP siehe OnAuthorization und OnSelectAuthorization (z.B. mit TIdBasicAuthentication) Schade, dass es nicht sowas wie bei den REST-Komponenten gibt: also TSimpleAuthenticator/THTTPBasicAuthenticator/TOAuth1Authenticator/TOAuth2Authenticator, welche man anhängen kann. |
AW: Dateien von einem virtuellen Server holen
Ich habe jetzt von unserer IT folgendes bekommen:
xxxxx.cer – Das ist das Webserverzertifikat als solches Issuca.cer - Das ist das Zertifikate der immediate-CA Rootca.cer - Das ist das Zertifikat der Root-CA xx.key - Das ist der private Key Reichen diese Dateien für HTTPS aus? Kommen die alle in die Routinen vom HTTPServer? Man sagte dass ich auch den Zertifikatsspeicher von Windows auslesen könne. Da habe ich aber noch gar keine Beispiele gefunden. |
AW: Dateien von einem virtuellen Server holen
Zitat:
Genutzt habe ich dann IdHTTPServer1 und dann im IOHandler dann IdServerIOHandlerSSLOpenSSL1 gesetzt. Dann soll ich noch die beiden DLL von Indy ins Programmverzeichnis kopieren. Soweit verstehe ich das. Was aber mit den o.g. Dateien? SSLOption.KeyFile -> xx.key SSLOption.RootCertFile -> Rootca.cer SSLOption.CertFile -> Issuca.cer oder xxxxx.cer ??? Wenn ich das xxxxx.cer anklicke, sehe ich oberhalb dann das Issuca.cer und dann ganz oben das Rootca.cer. Damit habe ich 3 Zertifikate, aber nur 2 Einträge in den SSLOptions. Benötige ich alle 3 Zertifikate oder nur 2? |
AW: Dateien von einem virtuellen Server holen
Zitat:
Indy kann m.W. aber auch HTTPS mittels OpenSSL. Und von OpenSSL gibt's zur noch auch ein Tool um ein Zertifikat zu generieren. Da es selbst erzeugt ist werden halt alle möglichen Webbrowser meckern, wenn's aber nur Anwendungsintern geht und das Zertifikat v.a. zur Verschlüsselung benutzt werden soll, dann könnte das schon reichen. Grüße TurboMagic |
AW: Dateien von einem virtuellen Server holen
Ja, keine Ahnung. Auch ein Webserver bedient für mich erstmal HTTP. Das muss ganz normal in allen Lebenslagen funktioniern. Davor hängt dann jenachdem ein Apache oder nginx .. und macht den Rest, z.B. HTTPS. Sowas würde ich nicht selbst schreiben. Die Indy Compos kenne ich auch nicht.
|
AW: Dateien von einem virtuellen Server holen
Ich habe nun von unserer IT die Info bekommen, ob ich das nicht über den IIS machen könnte. So habe ich im Delphi eine DLL erstellt. Auf meinem Rechner scheint das nun zu gehen, nur muss es auch auf dem virtuellen Server gehen. Dann sollte höchstwahrscheinlich auch das Problem mit den Zertifikaten erledigt sein.
Ich berichte wieder, wenn es neue Erkenntnisse gibt. |
AW: Dateien von einem virtuellen Server holen
Wie schonmal gesagt, kann der IIS das HTTP/HTTPS an einen anderen (deinen) HTTP-WebServer weiterreichen. (er macht dann das SSL/TSL)
OK, oder eben via DLL direkt da rein. |
AW: Dateien von einem virtuellen Server holen
Mit der DLL geht nun der nächste Schritt. Ich kann Dateien, die auf dem Server liegen, per Get abholen.
Jetzt steht nur noch das Problem, dass die Dateien eigentlich nicht auf dem Server der VM liegen, sondern auf anderen Servern liegen. Das klappt offenbar nicht, da der IIS vermeintlich unter einem anderen User läuft. Das hat der Kollege von der IT noch nicht hinbekommen. Er meinte auch, dass ich das Abholen von den anderen Servern mit einem anderen User Context machen solle. Ich schaue mittels der DLL einfach mit FileExists, ob die Datei da ist, ist sie aber nicht. Kann ich FileExists mit einem anderen User laufen lassen? Der Kollege meinte so etwas wie SMB Sharing. |
AW: Dateien von einem virtuellen Server holen
Wie gesagt, der Lösung mit HTML-Weiterleitung ist egal, in welchem User sein Server liefe.
Man kann in einem Prozess (EXE/DLL) einen neuen Thread mit einem anderem User ausführen, oder komplett ein zweiter Prozess und via IPC miteinander reden. ![]() |
AW: Dateien von einem virtuellen Server holen
Zitat:
Zitat:
Danke, da muss ich mich wieder ein wenig reinlesen. |
AW: Dateien von einem virtuellen Server holen
Zitat:
Vielleicht benötigt dies auch jemand anderes einmal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz