![]() |
Webbroker und mehrere Seiten unter localhost
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen
Der Titel fasst mein Problem ziemlich passend zusammen. In einem Eventhandler 'OnBeforeDispatch' habe ich folgenden Code:
Delphi-Quellcode:
Wenn ich die Exe und anschliessend den Server starte, sieht das so aus, wie im Anhang ersichtlich.
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; 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:
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...
LogStream.WriteBuffer(Request.PathInfo, SizeOf(Request.PathInfo));
LogStream.WriteBuffer(Request.Referer, SizeOf(Request.Referer)); LogStream.WriteBuffer(Request.URL, SizeOf(Request.URL)); |
AW: Webbroker und mehrere Seiten unter localhost
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... |
AW: Webbroker und mehrere Seiten unter localhost
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:
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 |
AW: Webbroker und mehrere Seiten unter localhost
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?!
|
AW: Webbroker und mehrere Seiten unter localhost
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:
Das brachte mmich auf die Idee, den Referer nach den gesuchten Angaben zu Filtern. Zitat:
Ausser dem DefaultHandler wird kein weiteres Actionitem aufgerufen, egal, ob ich das nun selber zu machen versuche oder nicht. Gruss Delbor |
AW: Webbroker und mehrere Seiten unter localhost
(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.: ![]() (5) Lass mal zum Testen das "BeforeDispatch" komplett weg. |
AW: Webbroker und mehrere Seiten unter localhost
Liste der Anhänge anzeigen (Anzahl: 5)
Hi Olli73
Sorry, wenn ich erst jetzt antworte; gestern abend musste ich nochmal weg, und anschliessend wars zu spät. Nun, ich hab gewissermassen das Pferd vom Schwanz her aufgezäumt und also folgendermassen begonnen:
Wie das angehängte Webmodul-Jpeg zeigt, habe ich 6 Pageproducers auf dem Modul, von denen nur die 2 am rechten Rand zu Html-Seiten verweisen. Deren Propertys HTML-File weisen auf die entsprechenden Dateien im Ordner 'HTML' hin:
Allerdings definiert der CSS-Code auch diverse Boxen, die als Rahmen für diese Bilder fungieren: Wenn die Seite angezeigt würde, müsste ich diese Rahmen zu sehen kriegen. Die beiden mittleren Pageproducers enthalten in ihren HTMLDoc-Propertis jeweils die den beiden oben genannten Seiten zugeordneten Css-Scripts. Der Code der WebActionItems und der PageproducerHtmlTags:
Delphi-Quellcode:
Über die Eigenschaften geben dir die angehängten Jpegs Auskunft.
procedure TWebModule1.WebModule1WebActHomeAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducerHome.Content; Response.Content := Response.Content + PageProducerLogo.Content; Handled := True; end; procedure TWebModule1.WebModule1WebActRomanticeRoadAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducerRomanticRR.Content; Response.Content := PageProducerRomanticRR.Content + PageProducerRomanticCSS.Content; Handled := True; end; procedure TWebModule1.PageProducerHomeHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin if TagString = 'DELBORHOMECSS' then ReplaceText := PageProducerHomeCSS.Content; if Tagstring = 'MENUE' then ReplaceText := PageProducerMenueCSS.Content; end; procedure TWebModule1.PageProducerRomanticRRHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin if TagString = 'ROMANTICSPURCSS' then ReplaceText := PageProducerRomanticCSS.Content; if Tagstring = 'MENUE' then ReplaceText := PageProducerMenueCSS.Content; end; Zitat:
Ich hoffe, deine Fragen genügend beantwortet zu haben. Gruss Delbor |
AW: Webbroker und mehrere Seiten unter localhost
- Benutzt du nun ein WebModul oder ein "normales" Modul mit WebDispatcher-Komponente? Beides zusammen soll man wohl vermeiden (sieht auf den Screenshots aber danach aus).
- Backslash ist unter DOS+Windows. Im Web(-Browser) musst du wie unter Linux immer Slash verwenden. - Ein Eintrag "/Auf romantischer Spur" (mit Leerzeichen) erleichtert im Web nicht gerade die Fehlersuche; beim Aufruf müsstest du die Leerzeichen ggf. durch %20 ersetzen. - Manche Browser machen Probleme, wenn man "localhost:8080" aufruft, ein "http://localhost:8080" hilft dann aber i.d.R. - Mit PageProducer habe ich keine Erfahrung. Ich würde an deiner Stelle, aber mal mit was Einfachem Testen, z.B. sowas:
Delphi-Quellcode:
procedure TWebModule1.WebModule1WebActRomanticeRoadAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin Response.Content := 'Hallo Welt!'; Handled := True; end; |
AW: Webbroker und mehrere Seiten unter localhost
Hi Olli73
Zitat:
Zitat:
Zitat:
Zitat:
Die Frage bleibt also: Wieso wird im Browser zwar die Adresszeile auf die beschriebene komische Art aktualisiert, die Seite aber nicht angezeigt und das OnHtmlTag des ActionsItems nicht aufgerufen? Gruss Delbor |
AW: Webbroker und mehrere Seiten unter localhost
Zitat:
Zitat:
Zitat:
![]() ![]() Hätte ich jetzt anders gedeutet. Zitat:
Zitat:
Zitat:
Zitat:
Alle Hochachtung! Mir passiert es öfters, dass ich z.B. ein ">" oder ein """ oder gar ein "</tag>" vergesse und deshalb die Seite nicht (richtig) funktioniert. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 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