Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi WebService - Nur mit webserver möglich? (https://www.delphipraxis.net/148003-webservice-nur-mit-webserver-moeglich.html)

moelski 20. Feb 2010 13:44


WebService - Nur mit webserver möglich?
 
Moin !

Ich habe im web mal ein bisschen über Webservices gelesen (nicht abfragen sondern selber einen erstellen).
z.B. hier:
http://www.delphi-treff.de/tutorials...t/webservices/
http://blogs.embarcadero.com/pawelgl...08/12/18/38624

Soweit so gut ...

Überall steht dort das man zum Betrieb einen Webserver braucht. Ohne geht das nicht, oder? Kann die Anwendung nicht selber auf Anfragen reagieren?

Ich frage deshalb weil wir in der Firma eine normale Delphi Anwendung haben. Die muss in Zukunft aber mit der Aussenwelt sprechen. Und ein SAOP Interface mittels Webservice würde sich da anbieten.
Nun ist mir aber nicht klar ob ich einer Anwendung einen Webservice hinzufügen kann, oder ob das generell immer eigenständige Anwendungen sind. Letzteres würde bedeuten ich muss zwischen meiner "normalen" Anwendung und dem webservice eine extra Kommunikation einrichten?

Vielleicht hat da jemand ein paar Erfahrungen.

jfheins 20. Feb 2010 14:04

Re: WebService - Nur mit webserver möglich?
 
Also ich glaube, der Weg über den Webserver ist der Normalfall - weil dir dann eine ganze Menge Arbeit abgenommen wird ;)
(Geht auch mit Delphi: http://www.delphi-treff.de/tutorials...rvices/page/1/ )

Ansonsten kannst du natürlich immer einen IdHTTPServer in dein Programm einbauen, der eien fernsteuerung ermöglicht ;)

moelski 20. Feb 2010 14:16

Re: WebService - Nur mit webserver möglich?
 
Moin !

Zitat:

Geht auch mit Delphi: http://www.delphi-treff.de/tutorials/ ... -und-internet/webservices/page/1/ )
Ne. Denn da steht:
Zitat:

Wir werden die Windows-Version des Apache verwenden.
Zitat:

Ansonsten kannst du natürlich immer einen IdHTTPServer in dein Programm einbauen, der eien fernsteuerung ermöglicht
Das Programm hat schon einen TCP Server im Bauch (der muss allerdings bald umgebaut werden zum Client).

Nuja, es wäre halt praktisch wenn man einen (Indy?) HTTP Server einbindet, SOAP "drüber" stülpt und fertig ist die Lutzi :)
Dann hatte man ein WebService Interface in der eigenen Anwendung.

Bin mir aber nicht sicher ob das so klappt?

Astat 20. Feb 2010 14:47

Re: WebService - Nur mit webserver möglich?
 
Hallo moelski,

Zitat:

Zitat von moelski
Überall steht dort das man zum Betrieb einen Webserver braucht. Ohne geht das nicht, oder?

Jein, man braucht eine Möglichkeit zur Kommunikation über das Netzwerk.
Im einfachsten Fall ist dies ein Listening Socket, der die Requests empfängt,
und die XML Daten aufbereitet.

Zitat:

Zitat von moelski
Kann die Anwendung nicht selber auf Anfragen reagieren?

Ja, wenn ein Socket Listener vorhanden ist.


Zitat:

Zitat von moelski
Ich frage deshalb weil wir in der Firma eine normale Delphi Anwendung haben.
Die muss in Zukunft aber mit der Aussenwelt sprechen.
Und ein SAOP Interface mittels Webservice würde sich da anbieten.

Hier stellt sich die Frage, welche Services angeboten werden sollen, und wer diese nutzen soll und kann.
Datenaustausch mit Webservices (HTTP + SOAP) ist zwar bequem, aber äußerst ineffektiv.
Überall wo Performance eine Rolle spielt, hat HTTP, SOAP und Co. nichts verloren.


Zitat:

Zitat von moelski
Nun ist mir aber nicht klar ob ich einer Anwendung einen Webservice hinzufügen kann,
oder ob das generell immer eigenständige Anwendungen sind.

Da es sich bei Webservices um standartisierte Verfahren handelt, findet auch eine Arbeitsteilungs statt.

1. Applikation die die Kommunikation über das Netzwerk sicherstellt (Webserver wie Appache, Tomcat, IES usw..)
2. Diese Webserver stellen wiederum Schnittstellen für Fremdanwendungen zur Verfügung (ISAPI, CGI usw.)
3. Die eigentlichen Anwendungen (ISAPI Dll's bzw. CGI)

Wenn alles in die eigene Anwendung soll, muss man mindestens Punkt 1 u. 3 selber realisieren.

Zitat:

Zitat von moelski
..ich muss zwischen meiner "normalen" Anwendung und dem webservice eine extra Kommunikation einrichten?

Da gibt es wie schon erwähnt, verschiedene Schnittstellen, ISAPI, CGI und Co.

Delphi bietet dahingehend, je nach Lizenz verschiedene Möglichkeiten,
ISAP, NSAPI, CGI und Appache Anwendungen zu erstellen.


lg. Astat

moelski 20. Feb 2010 16:11

Re: WebService - Nur mit webserver möglich?
 
Moin !

Danke für deine Ausführung.
Performance spielt an der Stelle keine Rolle. Es geht da eher um reine Notifikationen der Anwendung.

Ich habe jetzt noch was weitergesucht und das gefunden:
http://www.digicoast.com/delphi_soap_standalone.html

Und nachdem ich bei D2010 das indy 10 per SVN auf aktuellen stand gewuchtet habe, konnte ich das auch umsetzen.
Teste gerade mit meinem kollegen schon über INet den Webservice der rausgekommen ist - gehostet durch meine eigene Anwendung :) :)

Hier habe ich auch noch Infos gefunden:
http://www.2p.cz/files/2p.cz/downloa..._in_delphi.pdf

Aber das habe ich noch nicht genau angesehen.

Was mir jetzt noch etwas unklar ist ...
Wird jeder Client der den Webservice nutzt mit einem eigenen Thread bedient?
Und wenn ja ... Dann kann ich ja nicht ohne weiteres mit der Hauptanwendung Daten austauschen ... !?

mjustin 20. Feb 2010 16:56

Re: WebService - Nur mit webserver möglich?
 
Zitat:

Zitat von moelski
Wird jeder Client der den Webservice nutzt mit einem eigenen Thread bedient?
Und wenn ja ... Dann kann ich ja nicht ohne weiteres mit der Hauptanwendung Daten austauschen ... !?

Web Services werden meist zustandslos gestaltet. Jeder Request ist also nicht Bestandteil einer "Session". Wie bei simplen HTTP, das zustandslos ist. Der Web Service Aufruf führt nur eine Operation auf dem Server aus, die das dortige Datenmodell ändert oder abfragt.

Bei Microsoft CRM zum Beispiel besteht der gesamte Web Service nur aus Objekten zum anlegen, suchen, speichern und löschen der bereitgestellten Geschäftsobjekte - vier sehr einfach gestrickte Methoden.

Wenn man einen Zustand der Web Anwendung benötigt, führt das zu einigem Aufwand: jeder Request muss einer Session zugeordnet werden (über eine Art Transaktions-ID) und der gesamte Zustand der Sitzung muss irgendwo gespeichert und von dort her wieder geladen werden, wenn der nächste Request eintrifft. Die Wartung solcher Monster ist aufwendig. Auch sind diese Zustände nicht einfach skalierbar: wenn jedesmal ein anderer Server den nächsten Request beantworten soll (bei Load Balancing), muss der gesamte Zustand auch auf diesem Server bereitgestellt werden.

Keines der Web Service Frameworks die ich bisher kennen gelernt habe arbeitet mit Zuständen, aber es waren auch noch nicht so viele :)

Bei WCF (Windows Communication Framework) hat man die dazu nötigen CookieContainer bei der neueren Version aber einfach über Bord geworfen:

http://stackoverflow.com/questions/1...cf-web-service

Darin wird empfohlen, mindestens dreimal nachzudenken, bevor man Zustand in einem Web Service einbaut...


Viele Grüße,

Astat 20. Feb 2010 16:57

Re: WebService - Nur mit webserver möglich?
 
Zitat:

Zitat von moelski
Wird jeder Client der den Webservice nutzt mit einem eigenen Thread bedient?

Das kommt auf die Implementierung des Servers an, das ist beim Entwickler zu erfahren. :mrgreen:
Der Entwickler prüft dies, indem er ein Sleep(20000) in das Requestevent einfügt,
und mit GetCurrentThreadId feststellt, ob diese unteschiedlich ist, wenn
sich mehrere Instanzen des Clients sich zum Server verbinden.

Zitat:

Zitat von moelski
Und wenn ja ... Dann kann ich ja nicht ohne weiteres mit der Hauptanwendung Daten austauschen ... !?

Hier stellt sich zuerst einmal die grundsätzliche Designfrage,
wie ein solches Client Server System überhaupt aufzubauen ist?

Erklär doch mal genau was Du da eigentlich vor hast, es sieht mir alles sehr "überkompliziert" aus.

Stichwort:

Zitat:

Zitat von moelski
Es geht da eher um reine Notifikationen der Anwendung

Blick da nicht ganz durch :gruebel:

lg. Astat

mjustin 20. Feb 2010 17:17

Re: WebService - Nur mit webserver möglich?
 
Zitat:

Zitat von moelski
Wird jeder Client der den Webservice nutzt mit einem eigenen Thread bedient?
Und wenn ja ... Dann kann ich ja nicht ohne weiteres mit der Hauptanwendung Daten austauschen ... !?

Ah, jetzt verstehe ich die Frage :)

Wenn der Standalone Web Service Server einen Request vom Client erhält, wird er in einem eigenen Thread bearbeitet (auslesen, verarbeiten, Response zum Client zurücksenden). Wenn also 'globale' Daten im Web Server verwendet werden sollen, dann müssen diese ausserhalb der Threads threadsicher verwaltet werden. Zum Beispiel wenn umfangreiche Daten aus der Datenbank gecached werden um sie nicht bei jedem Request erst auszulesen, dann sind diese in einer Liste, auf die mehrere Threads gleichzeitig zugreifen. Wenn dabei auch schreibende Zugriffe stattfinden, müssen diese natürlich so synchronisiert werden, dass es keine Konflikte gibt. Dazu können TCriticalSection & Co. verwendet werden.

Tipp: ich würde den Web Service Server nicht als Windows-Formularanwendung sondern als Konsolenanwendung oder als Dienst aufbauen, damit es nicht noch störende Einflüsse der Windows Events auf das Programm gibt, der Server sollte möglichst "schlank" sein.

Viele Grüße,


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz