Zum Hauptinhalt springen

Web-Schnittstelle - Kommunikation mit der Server-Erweiterung

Web-Schnittstelle - Kommunikation mit der Server-Erweiterung Kommunikation mit der Datenbank

Wie in dem vorhergehenden Kapitel beschrieben, wird bei einem Request eine Verbindung zu einem Server mit einer bestimmten IP-Adresse aufgebaut. Im Request-Header wird dann die Quelle der angeforderten Daten angegeben. Normalerweise handelt es sich dabei um eine Datei, die vom Web-Server (IIS) an den Browser übermittelt wird.

Identifikation des Web-Servers

Ausschlaggebend für die Identifizierung des Web-Servers ist die IP-Adresse. Ein Web-Server kann über eine oder mehrere ("multi-homed") IP-Adressen angesprochen werden. Diese IP-Adressen können wiederum einer oder mehreren ("virtual") Sites zugeordnet sein. Jede dieser Sites kann über ein eigenes Verzeichnis verfügen, aus dem Dokumente bei einem Request übertragen werden. Besitzen mehrere Sites dieselbe IP-Adresse, so müssen diese durch unterschiedliche Hostnamen voneinander unterschieden werden.

Der IP-Adresse 62.132.119.100 ist beispielsweise der Site mit dem Hostnamen www.vectorsoft.de zugeordnet. Im IIS kann eine weitere Site definiert werden, die über die gleiche IP-Adresse angesprochen wird, aber mit dem Hostnamen shop.vectorsoft.de. Damit der Web-Server über den Hostnamen angesprochen werden kann, muss natürlich ein entsprechender Eintrag im DNS-Server erfolgen.

Die beiden Sites können jetzt nicht mehr alleine aufgrund ihrer IP-Nummer unterschieden werden. Die Unterscheidung wird dann anhand des Hostnamen getroffen. Der Browser trägt im Request-Header automatisch im Eintrag Host den Hostnamen ein. Nachdem die Site identifiziert ist, kann auf deren Ressourcen zugegriffen werden.

Aus der URL http://shop.vectorsoft.de/scripts/c16_web.dll wird über einen DNS die IP-Adresse ermittelt und eine Verbindung hergestellt. Der dazugehörende Request sieht wie folgt aus:

GET /scripts/c16_web.dll HTTP/1.1
Host: shop.vectorsoft.de
...

In den Ressourcen der Site shop.vectorsoft.de wird nach dem Verzeichnis /scripts gesucht und die Datei c16_web.dll geladen. Im Unterschied zu anderen Dateien wird anhand der Dateierweiterung (.dll) erkannt, dass es sich nicht um eine Datei handelt, die an den Client übertragen werden soll. Es wird als Antwort also nicht die Datei c16_web.dll selbst gesendet, vielmehr wird der gesamte Request an die Funktionen der DLL weitergeleitet.

Es obliegt dem Client, den Request auszuwerten und eine Datei an den IIS zurückzugeben, die er dann an den Browser sendet. Die Ressourcen einer Site können sich mit den Ressourcen einer anderen Site überschneiden. So ist es möglich, dass zum Beispiel beide Sites (www.vectorsoft.de und shop.vectorsoft.de) das gleiche Skript besitzen und damit denselben Client verwenden. Der Client wird so über die URL http://www.vectorsoft.de/scripts/c16_web.dll und http://shop.vectorsoft.de/scripts/c16_web.dll angesprochen.

Identifikation der Applikation

Mit einem Client können mehrere Applikationen (Datenbanken) betrieben werden. In einer Applikation werden Benutzeranfragen und Eingaben, die vom Browser übermittelt werden, ausgewertet und entschieden, welches Dokument an den Browser zurückgesendet wird. Die verschiedenen Applikationen werden in der Konfigurationsdatei des Clients eingetragen.

Die Identifikation der Applikation erfolgt über den Hostnamen bzw. die IP-Nummer. Benutzen mehrere Applikationen den selben Hostnamen, so muss die Anwendung zusätzlich über das Argument C16APP im Query-String identifiziert werden. Der im Request-Header eingetragene Hostname entspricht der Zeichenkette der URL, die zwischen dem // und dem ersten / steht. Dies kann sowohl ein Rechnername, als auch eine IP-Nummer sein. Einer einzelnen Applikation können auch mehrere Hostnamen bzw. IP-Nummern zugeordnet werden.

In der Konfigurationsdatei des Clients (Eintrag web_url_id) werden die Hostnamen angegeben, mit der die Applikation identifiziert wird. Um bei unserem Beispiel zwei unterschiedliche Applikationen zu erreichen, müssen zwei Einträge vorhanden sein. Für die erste Applikation muss web_url_id auf www.vectorsoft.de und für die zweite Applikation in einem weiteren Abschnitt der Konfigurationsdatei auf shop.vectorsoft.de gesetzt werden (vgl. Web-Schnittstelle - c16_web.cfg .

Eine Applikation kann so aber nur dann angesprochen werden, wenn der Hostname in der URL angegeben wurde. Erfolgt der Aufruf des Clients über die URL http://62.132.119.96/scripts/c16_web.dll, ist im Host-Eintrag nur die IP-Nummer vorhanden und eine Applikation kann nicht eindeutig ermittelt werden. Um eine Applikation sowohl unter dem Hostnamen, als auch unter der IP-Nummer zu erreichen, können zwei durch Semikolon getrennte Einträge in web_url_id vorgenommen werden:

web_url_id = www.vectorsoft.de;62.132.119.100 

Sollen mehrere Applikationen auch noch unter dem gleichen Hostnamen laufen, kann eine weitere Unterscheidung durch den Eintrag web_app_id getroffen werden. Der URL muss dann das Argument C16APP mit der Applikations-ID angehangen werden.

http://www.vectorsoft.de/scripts/c16_web.dll?C16APP=Kunden

In der Konfigurationsdatei wird dann web_app_id = Kunden angegeben.

Kommunikation mit der Datenbank

Ist die Applikation identifiziert, wird ein Web-Benutzer angelegt. Dieser Web-Benutzer erhält eine eindeutige ID, bestehend aus einer 24stelligen Zeichenkette. Diese ID wird bei zukünftigen Anfragen an den Client im Query-String als Argument (C16UID) oder als Teil der URL übermittelt. Durch die Übertragung einer gültigen ID erfolgt auch automatisch die Zuordnung zur entsprechenden Applikation.

Nach dem Anlegen des Web-Benutzers baut der Client eine Verbindung zur Datenbank auf. Die dafür benötigten Informationen (Datenbank-Server, Datenbankname, Benutzername und Kennwort) werden in der Konfigurationsdatei des Clients im Abschnitt der Applikation eingetragen. Nach dem Öffnen der Datenbank existieren somit zwei "Benutzer" auf unterschiedlichen Ebenen. Zum einen gibt es einen Web-Benutzer, der im Client registriert ist, zum anderen gibt es einen Datenbank-Benutzer, der in der Datenbank angemeldet ist.

In der Datenbank wird anschließend die in der Konfigurationsdatei unter dieser Applikation angegebene Request-Funktion ausgeführt. Die Request-Funktion wertet die übergebene Browseranfrage aus und gibt ein Dokument an den IIS zurück. Das Dokument wird dann an den Browser zurückgesendet.

Handelt es sich bei dem Dokument um eine HTML-Seite, können dort wiederum Links mit Informationen für die Request-Funktion enthalten sein. Dieser Link verweist, wie in den obigen Beispielen, auf die c16_web.dll und übergibt im Query-String die entsprechenden Informationen. Diese Informationen werden wiederum von der Request-Funktion ausgewertet und mit einem Dokument beantwortet.

Das Dokument kann entweder vollständig aus der Datenbank generiert werden oder als externe Datei vorliegen. Es kann besondere Kommandos enthalten, die von dem Client vor dem Versenden interpretiert werden. Über diese Kommandos können Links in HTML-Seiten eingebunden oder weitere Funktionen in der Datenbank aufgerufen werden.

Die Verbindung zwischen Client und Datenbank

Trifft ein Request für eine Applikation beim Client ein, wird zunächst überprüft, ob eine vom Client bereits eingerichtete Datenbankverbindung verwendet werden kann. Ist noch keine Datenbankverbindung vorhanden, wird ein entsprechender Benutzer bei der Datenbank angemeldet. Unter Verwendung der Datenbankverbindung wird dann wiederum die Request-Funktion aufgerufen.

Die Request-Funktion gibt ein Dokument zunächst an den Client zurück. Das entsprechende Dokument wird auf Befehle untersucht, die vom Client verarbeitet werden müssen. An dieser Stelle können weitere Funktionen aus der Datenbank aufgerufen werden. Diese Funktionen werden von dem gleichen Datenbankbenutzer ausgeführt. Nach der Rückgabe des so entstandenen Dokuments an den Web-Server (und damit an den Browser) ist der Request abgearbeitet. Der Web-Benutzer benötigt die Verbindung mit der Datenbank nicht mehr und gibt sie frei. Die Datenbankverbindung wird aber nicht sofort beendet. Trifft ein weiterer Request von einem beliebigen Web-Benutzer ein, steht die Datenbankverbindung jetzt für diesen Request zur Verfügung. Erst wenn die Datenbankverbindung über einen längeren Zeitraum nicht zur Bearbeitung eines Requests benötigt wird, wird der entsprechende Datenbankbenutzer abgemeldet und die Verbindung beendet.

Auf diese Weise kann eine Datenbankverbindung von mehreren Web-Benutzern verwendet werden. Werden von mehreren Web-Benutzern gleichzeitig Requests an den Client gesendet, können weitere Verbindungen zur Datenbank geöffnet werden.

Durch Einstellungen in der Konfigurationsdatei kann für jede Applikation die maximale Anzahl der Datenbankverbindungen individuell eingestellt werden (siehe Web-Schnittstelle - c16_web.cfg ).

Durch diese Verteilung der Web-Benutzer auf unterschiedliche Datenbank-Benutzer wird das Benutzerlimit des CONZEPT 16-Servers durch eine Web-Anwendung nicht über Gebühr beansprucht.

Dadurch, dass ein Datenbank-Benutzer von mehreren Web-Benutzern verwendet wird, ergeben sich einige Konsequenzen, die bei der Programmierung von Funktionen für die Web-Schnittstelle berücksichtigt werden müssen. Ein Request wird immer von einem Datenbank-Benutzer abgehandelt. Innerhalb eines Requests kann also wie gewohnt programmiert werden. Zustände bleiben aber nicht über einen Request hinaus erhalten. Lediglich, was in globalen Datenbereichen abgelegt wird, bleibt auch über den Request hinaus gespeichert.

Beispiel:

In einem Request soll der nächste Datensatz einer Tabelle gelesen werden. Damit das richtige Ergebnis erzeilt wird, muss im Request selbst oder in einer globalen Variablen der eindeutige Schlüsselwert des jetzigen Datensatzes abgelegt werden. Der Inhalt von Feldpuffern kann sich in der Zwischenzeit durch einen anderen Request (der den gleichen Datenbank-Benuzter verwendete) verändert haben. Davon sind ebenfalls dynamische Strukturen, benutzerdefinierte Feldpuffer, Textpuffer usw. betroffen.

Von einem Web-Benutzer kann immer nur ein Request bearbeitet werden. Da während der Browser auf eine Antwort eines Requests wartet, weitere Requests an den Client gesendet werden können (z. B. durch wiederholtes Anklicken eines Links), wird ein weiterer Request des Web-Benutzers in einer Warteschlange abgelegt. Weitere Requests des Benutzers werden abgelehnt. Die Übertragung des Ergebnisses eines Request (z. B. Download einer Datei) kann aber auf einen Zeitpunkt verschoben werden, nachdem der Request abgearbeitet ist. Somit steht der Web-Benutzer wieder zur Verfügung, auch wenn die Datei, die zurückgesendet werden soll, noch übertragen wird.

Wird eine Seite an den Browser zurückgegeben, kann diese wiederum Links mit entsprechenden Parametern enthalten, die von der Request-Funktion ausgewertet werden können. Die Seite kann entweder vollständig aus der Datenbank generiert werden, oder es wird der Dateiname einer externen Datei angegeben. Die zurückgegebene Seite kann wiederum Prozeduraufrufe in die Datenbank enthalten. Der Rückgabewert des Aufrufs wird in die Seite integriert. Eine HTML-Seite kann also auf zwei Wegen mit Datenbankinhalten gefüllt werden:

  • Die Seite wird in der Datenbank aufbereitet
  • Es wird eine unvollständige Seite zurückgegeben, die durch weitere Prozeduraufrufe mit Informationen gefüllt wird

Trifft also ein Request ein, wird eine Prozedur durchgeführt, die eine HTML-Seite zurückgibt. Die Seite kann entweder Zeilenweise aus der Applikation generiert werden oder als Datei auf der Festplatte vorliegen. Die zurückgegebenen Zeilen oder die zu übertragende HTML-Seite kann neben HTML-Anweisungen C16.-Anweisungen enthalten. Diese Anweisungen werden durch die Web-Schnittstelle ausgewertet. Eine solche Anweisung kann zum Beispiel eine Funktion in der Datenbank aufrufen, die weitere Inhalte in die HTML-Seite integriert.

Neben den eigentlichen Daten werden Links in die Seite integriert, die ein Navigieren in der Applikation ermöglichen. Diese Links sollten so aufgebaut werden, dass aus ihnen die Seite, auf welcher der Link steht, hervorgeht. Der Browser hat immer die Möglichkeit eine vorhergehende Seite anzuzeigen, ohne das ein Request gesendet, also der Applikation der Seitenwechsel mitgeteilt wird. Anweisungen zum Erstellen dieser Links können in die HTML-Seiten integriert werden. Diese Anweisungen werden dann vom Client durch entsprechende Informationen ersetzt.