AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Webbroker und mehrere Seiten unter localhost
Thema durchsuchen
Ansicht
Themen-Optionen

Webbroker und mehrere Seiten unter localhost

Ein Thema von Delbor · begonnen am 28. Sep 2015 · letzter Beitrag vom 29. Sep 2015
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#1

Webbroker und mehrere Seiten unter localhost

  Alt 28. Sep 2015, 11:43
Hi zusammen
Der Titel fasst mein Problem ziemlich passend zusammen.

In einem Eventhandler 'OnBeforeDispatch' habe ich folgenden Code:
Delphi-Quellcode:
procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  var List: TStringList; Refererstr, SourceStr, LogPath: string; i,x: Integer;
      LogStream : TFileStream;
begin
  List := TStringList.Create;
  LogPath := 'I:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer';
  LogStream := TFileStream.Create(LogPath,fmOpenReadWrite);

  try
    LogStream.WriteBuffer(Request.PathInfo, SizeOf(Request.PathInfo));
    LogStream.WriteBuffer(Request.Referer, SizeOf(Request.Referer));
    LogStream.WriteBuffer(Request.URL, SizeOf(Request.URL));
    Form1.Memo1.Lines.Add('PathInfo := '+ Request.PathInfo);
    Form1.Memo1.Lines.Add('Referer := ' + Request.Referer);
    Form1.Memo1.Lines.Add('From := ' + Request.From);
    Form1.Memo1.Lines.Add('Url := ' + Request.URL);
    Form1.Memo1.Lines.Add('****************************');
    Request.QueryFields.Delimiter := ';';
    Form1.Memo1.Lines.Add('QueryFields : ');
    Request.ExtractQueryFields(List);
    Form1.Memo1.Lines.AddStrings(List);
    Form1.Memo1.Lines.Add('****************************');
    Form1.Memo1.Lines.Add('GetEnumerator := '+ Request.Query);
    Form1.Memo1.Lines.Add('============================');
    

      for i := 0 to Self.Actions.Count -1 do
      begin
        Refererstr := Actions[i].PathInfo;
        if ContainsText(Request.Referer,Refererstr) then
        begin
          x := Pos(Refererstr,Request.Referer);
          SourceStr := Copy(Refererstr,x,SizeOf(Refererstr));
          if Self.Actions[i].PathInfo = SourceStr then
            Actions[i].OnAction(Sender,Request,Response, Handled);
        end;
      end;
  finally
    List.Free;
    LogStream.Free;
  end;
Wenn ich die Exe und anschliessend den Server starte, sieht das so aus, wie im Anhang ersichtlich.
Ich habe festgestellt, dass obige Prozedur bis zu vier mal ausgeführt wird, und offenbar wird das Memo dabei jedesmalüberschrieben. Zumindest schliesse ich das daraus, das die hartgecodeten Stings jeweils nur einmal angegeben sind.

Also versuchte ich, die Strings in ein Logfile zu schreiben, um so festzustellen, ob während der ersten drei Durchgänge die gesuchten Strings geschrieben werden. Aber da wird eine AV geworfen - Zugriff verweigert.
Sehe ich mir den Eigenschaften-Dialog zu den Parentordnern an, sind diese schreibgeschützt. Entferne ich diesen Schutz und übernehme die neuen Einstellungen, sind diese bei einem erneuten Öffnen des Eigenschaften-Dialogs wieder da.

Ein anderes Programm, das eine Ebene höher im selben Ordner liegt, benutzt ungehindert Filestreams...

Für meine diversen Webseiten (und die benötigten Css-Scripts) habe ich jeweils eigene PageProducer-Komponenten in eigenen WebActionItems, nur kriege ich es nicht hin, dass diese auch aufgerufen werden.

Wie, zum Kuckuck, zeige ich weitere als nur die erste Seite in einer Webbrokeranwendung an?

Gruss
Delbor

PS:
Um das untenstehende Kpeg zu machen, musste ich die Anwendung starten und folglich alle Zeilen betreffend den Logstream auskommentieren. Dabei ging eine seltsame Fehlermeldung, die vor dem Start auftritt, fast vergessen:
Delphi-Quellcode:
    LogStream.WriteBuffer(Request.PathInfo, SizeOf(Request.PathInfo));
    LogStream.WriteBuffer(Request.Referer, SizeOf(Request.Referer));
    LogStream.WriteBuffer(Request.URL, SizeOf(Request.URL));
In diesen Zeilen stoppt Delphi die Compilieruung, setzt das Caret vor die letzte Klammer und meckert, da müsse noch eine Variable hin... Die Help gibt aber lediglich an, dass die Prozeduren als overload deklariert sind...
Angehängte Grafiken
Dateityp: jpg Request-Auswertungen 2.JPG (47,6 KB, 32x aufgerufen)
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (28. Sep 2015 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
775 Beiträge
 
#2

AW: Webbroker und mehrere Seiten unter localhost

  Alt 28. Sep 2015, 12:26
Du hast ein ganz anderes Problem:

Von den Webmodulen werden automatisch mehrere Instanzen erstellt und alle (parallelen) Anfragen werden dann jeweils in einer von diesen Instanzen von Webmodul abgearbeitet, und zwar multithreaded (wäre ja auch blöd, wenn eine Anfrage mal länger dauert und alle anderen deswegen ewig warten müssten).

Bedeutet aber auch, dass du die "Regeln" für Threads einhalten musst. Und dein Zugriff auf "Form1" sieht nicht so aus, als ob du dir darüber Gedanken gemacht hättest...
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Webbroker und mehrere Seiten unter localhost

  Alt 28. Sep 2015, 14:15
Hi Olli73

Da bei Embarcadero nichts darüber nachzulesen ist, wann der/die Threads starten, und da Embarcadero selber das Event BeforeDispatch für Vorarbeiten wie DB-Zugriffe etc. empfiehlt, nahm ich mal an, dass BeforeDispatch gefeuert wird, bevor der Thread wirklich startet.

Zitat:
Von den Webmodulen werden automatisch mehrere Instanzen erstellt und alle (parallelen) Anfragen werden dann jeweils in einer von diesen Instanzen von Webmodul abgearbeitet, und zwar multithreaded (wäre ja auch blöd, wenn eine Anfrage mal länger dauert und alle anderen deswegen ewig warten müssten).
Nach meinem Stand der Unwissenheit wird für jede Anfrage genau eine Instanz des Webmoduls erzeugt. Die Embarcadero-Seiten habe ich bisher folgendermassen interpretiert:
  • Der Browser startet eine Anfrage, wenn der User auf ein Lesezeichen klickt oder die URL in der Adresszeile eingibt.
  • Der Dispatcher nimmt die Anfrage entgegen und feuert OnBeforeDispatch, sofern dieses Event assigned ist,
  • Startet danach/andernfalls einen Thread, in dem nun erstmal der Defaulthandler des Webmoduls abgearbeitet wird, sofern Handled nicht auf False umgestellt wurde(in diesem Fall würde der DefaultHandler am Schluss aller ActionItems abgearbeitet).
  • Wenn ActionItem[1] Handled auf True stellt, ist die Behandlung abgeschlossen und es werden keine weiteren ActionItems mehr abgearbeitet.
  • Wenn ActionItem[1] Handled auf False stellt (bzw. belässt), ist die Behandlung noch nicht abgeschlossen, und ActionItem[2] wird abgearbeitet. Diese Folgen können beliebig fortgesetzt werden, bis ein ActionItem Handled auf True stellt.
  • War Handled False, als die Bearbeitung der ActionItems begann, wird nun ActionItem[0] ausgeführt. Andernfalls war dies zu Anfang schon der Fall, und die Behandlung ist nun abgeschlossen.

Nach deiner Reaktion zu urteilen, hätte ich ganz offensichtlich vor meinen Zugriffen auf die Form eine Criticalsection einleiten müssen. Das würde wohl auch erklären, weshalb ich keinen Schreibzugriff auf den Speicher habe.
Nicht erklärt ist damit allerdings, wieso unter anderem die URL leer ist und PathInfo die offenbar zuletzt eingegeben Datei angibt.
Und woher kommen die offensichtlich 4 Threads? Es scheint mir im Moment so, als würden die im OnBeforeDispatch-Event erzeugt. Etwa durch meine Zugriffe auf Form1??

Über Kommentare, eventuell wo angebracht, auch etwas ausführlichere, würde ich mich sehr freuen! Vielen Dank!

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
775 Beiträge
 
#4

AW: Webbroker und mehrere Seiten unter localhost

  Alt 28. Sep 2015, 15:35
Könntest du nochmal klar herausstellen, was dein eigentliches Problem bzw. deine eigentliche Frage ist. Ich weiß nämlich nicht, was du mit deinem Code bezwecken willst. Warum rufst du beispielsweise die Eventhandler (OnAction) von deinen (WebModule.)Actions selber in einer Schleife auf? Dafür ist doch normalerweise der Dispatcher zuständig?!
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Webbroker und mehrere Seiten unter localhost

  Alt 28. Sep 2015, 16:26
Hi Olli73

Als erstes mal - auch wenn das jetzt nicht die Frage war - die Ausgaben auf der Form. Deren einzigeer und vorübergehender Sinn ist es, mir die zur Verfügung stehenden Parameterwerte anzuzeigen. Und da stellte sich schnell heraus, dass PathInfo und URL (scheinbar?) leer waren - der Dispatcher hat also gar keine PathInfo, die er mit derjenigen der Actionitems vergleichen könnte und kann demnach gar nicht anders, als die Standardseite anzuzeigen.
Dazu kommt: sobald die Standardseite erscheint (die Form gibt zu diesem Zeitpunkt gar nichts aus) und ich jetzt auf einen der Links in meinem HTML-Menue klicke, wird wieder der DefaultHandler abgearbeitet, die Form gibt den korrekten Pfad inklusive dem SeitenNamen (der dem Link entspricht) aus und in der TitelZeile erscheint der Pfad zu der angeforderten HTML-Seite. Mit der Besonderheit, dass der übergeordnete Folder ein weiteres mal aufgeführt wird. Das heisst:
  • Adresszeile: localhost\HTML\Index.html (Seite liegt in einem Ordner 'HTML')
  • Klick auf Item des HTML-Menues
  • Adresszeile: localhost\HTML\HTML\GewählteSeite.html
Das Layout und der Inhalt der angezeigten Seite ändern sich jedoch nicht. Die Form des Servers gibt jetzt als Referrer den Pfad und den Namen der Seite aus. Die andern Ausgabefelder bleiben leer.
Das brachte mmich auf die Idee, den Referer nach den gesuchten Angaben zu Filtern.
Zitat:
Könntest du nochmal klar herausstellen, was dein eigentliches Problem bzw. deine eigentliche Frage ist.
Mach ich gerne - ich kriegs nicht hin, eine andere Seite über einen Link in einem HTML-Menue einer angezeigten HTML-Seite aufzurufen.
Ausser dem DefaultHandler wird kein weiteres Actionitem aufgerufen, egal, ob ich das nun selber zu machen versuche oder nicht.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
775 Beiträge
 
#6

AW: Webbroker und mehrere Seiten unter localhost

  Alt 28. Sep 2015, 17:47
(1) Sind die Backslashs (\) nur ein Tippfehler? Im Web müssen natürlich Slashs (/) verwendet werden.

(2) Wenn du (statische) HTML-Dateien anzeigen willst, genügt es, einen TWebFileDispatcher auf das WebModul zu ziehen.

(3) Wie sehen denn deine Actions aus (Eigenschaften + Code).

(4) Funktioniert denn ein direkter Aufruf? (z.B.: http://localhost:8080/myaction)

(5) Lass mal zum Testen das "BeforeDispatch" komplett weg.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 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