|
Antwort |
Registriert seit: 8. Okt 2006 Ort: St.Gallen/Schweiz 1.186 Beiträge Delphi 11 Alexandria |
#1
Hi zusammen
Im Anhang findet ihr diverse Jpegs, die meinen Aktionseditor und einigee andere meiner definitionen im Bezzug auf Pathinfo zeigen. Stand der Dinge ist: Bei Programmstart ist der Wert von Request.Pathinfo (per Vorgabe von Delphi) "/". Aufgerufen wird, nach dem Haltepunkt im Event "OnBeforeDispatch" das DefaultWebActionItem.
Delphi-Quellcode:
In WebModuleBeforeDispatch prüfe ich, ob in Pathinfo der String 'Images' enthalten ist und weise dem Property WACImageItem.PathInfo den angeforderten Pfad der Bilddatei zu. Ich hatte erst für jedes Bild ein eigenes WebActionItem zuweisen wollen. Das ergäbe mindestens 12 Items bei 12 Bildern pro Seite, die alle bis auf den eigentlichen Dateinamen übereinstimmen - Grund genug, um dies in einer einzigen Action zu erledigen. Bis auf die Tatsache, dass die Pfade nicht gefunden werden, scheint dies zu klappen.
procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var PathInformation: String; begin PathInformation := Request.PathInfo; if Containstext(PathInformation, 'Images') then begin Self.ActionByName('WACImageItem').PathInfo := Request.PathInfo; end; end; Die Pfade werden nicht gefunden, weil Delphi meinen HTML-Links (Images/.../..) regelmässig den String '/html/' voranstellt - und da liegen die angeforderten Bilder nicht. Aber noch sind wir eigentlich erst bei der Start- oder Indexseite. Deren WebActionItem ruft das Homeitem auf:
Delphi-Quellcode:
und
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin if Request.PathInfo = '/' then WebModule1WebActHomeAction(Self,Request,Response,Handled); end;
Delphi-Quellcode:
Nachdem der einige src-Tags und Delphi-Tags beantwortet hat(Images/Background bzw. Replaccetags) wird die Seite anstandslos korrekt angezeigt.
procedure TWebModule1.WebModule1WebActHomeAction(Sender: TObject; // 1. Act
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducerHome.Content; Response.SendResponse; end; Auf dieser habe ich ein HTML-Menue, über das andere Seiten meines Webprojektes aufgerufen werden sollen. Das sind unter anderem:
Delphi-Quellcode:
Rufe ich BischofzellerRosenwochen auf, klappt alles, wie es soll, ausser den oben beschriebenen nicht gefundenen Bildpfaden.
<li><a href="#">Gotthardgiganten</a></li>
<li><a href="#">Französischer Dampf am Gotthard</a></li> <li><a href="html/AufromantischerSpur1.html">DVZO - Auf romantischer Spur1</a></li> <li><a href="html/BischofzellerRosenwochen.html">Mit Dampf an die Bischofszeller Rosenwochen</a></li> <li><a href="html/Das Juwel vom Waldenburgertal.html">Das Juwel vom Waldenburgertal</a></li> <li><a href="html/BahnhofsfestWattwil.html">Bahnhofsfest Wattwil</a></li> Rufe ich aber das Juwel vom Waldenburgertal auf, hat in BeforeDispatch Pathinfo den Wert '/html/Das Juwel vom Waldenburgertal.html', entsprechend dem Wert des WebactionItem-Objektes. Während des Durchsteppens landet der Cursor schliesslich in TIdCustomHTTPServer.DoExecute, wo zum Schluss die Verbindung gekappt wird. Der Browser zeigt nun eine leere Seite, die Adressezeile ist korrekt, und wenn ich mir den Seitenquelltext im Browser ansehen will, erhalte ich eine leere Seite. Mit andern Worten: Das WebactionItem.OnAction wird gar nicht aufgerufen (da befindet sich ein Haltepunkt). PathInfo hatte auch schon mal den Wert/html/html/Das Juwel vom Waldenburgertal.html . ebenso am Schluss die Adresszeile des Browsers - dieser hatte dafür aber weder Inhalt noch Seitenquelltext... Gruss Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht. Frei nach Albert Einstein http://roase.ch |
Zitat |
Registriert seit: 9. Dez 2010 Ort: Mönchengladbach 1.737 Beiträge Delphi 6 Enterprise |
#2
Ohne den ganzen Quellcode zu kennen, der da vielleicht noch mit reinspielt, scheint mir der einzige Unterschied zu sein, das beim "Problemfall" Leerzeichen teil der Pathinfo sind. Lass die doch mal weg oder ersetze sie durch Unterstriche.
Ralph
|
Zitat |
Registriert seit: 8. Okt 2006 Ort: St.Gallen/Schweiz 1.186 Beiträge Delphi 11 Alexandria |
#3
Hi Jumpie
Vielen Dank für Deine Antwort! Durch diese fällt mir jetzt auf, dass und warum die Seite "Auf Romantischer Spur komplett zusammengeschrieben ist. Die Seite entstand bei meinen ersten Versuchen, und irgendwie kann ich mich schwach erinnern, dass ich die Seite damals erst 'normal' beschriftete. Gruss Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht. Frei nach Albert Einstein http://roase.ch |
Zitat |
Registriert seit: 8. Okt 2006 Ort: St.Gallen/Schweiz 1.186 Beiträge Delphi 11 Alexandria |
#4
Hi zusammen
Leider hat das nicht geholfen... Gruss Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht. Frei nach Albert Einstein http://roase.ch |
Zitat |
Registriert seit: 8. Okt 2006 Ort: St.Gallen/Schweiz 1.186 Beiträge Delphi 11 Alexandria |
#5
Hi zusammen
Das Problem ist immer noch nicht gelöst. In den letzten Tagen habe ich mir in einer Excel-Tabelle mal die Werte beim durchsteppen festgehalten. Auffallend ist dabei die jeweilige Pathinfo und das Ergebnis:
Interessant ist: die Seiten der ersten beiden Pathinfos wurden nicht dargestellt, und der Browser enthielt auch keinen Seitenquelltext. Was dabei passiert: TWebRequest durchsucht die Collection Webaction, findet keine Übereinstimmung und kappt die Verbindung. Die dritte Seite hingegen wird dargestellt - zwar ohne Hintergrund und ohne CSS-Formatierung, aber sie wird offenbar gefunden. Und das bei völliger Übereinstimmung der Request- und der WebactionItem.Pathinfo mit den vorangehenden Links. Und nätürlich sind alle diese HTML-Dateien genau da, wohin Pathinfo zeigt. Irgendwie kam ich dann auf die Idee, dass solch seltsames Verhalten damit zu tun haben könnte, dass ich nirgendwo Critcalsection einsetze, obwohl das komplette Webmodul in einem eigenen Thread abläuft. Ich hab mich in der Vergangenheit darauf verlassen, dass das Webmodul, bzw. TPageproducer mit Criticalsection arbeitet. Ersteres wird in einer solchen erstellt, bzw aktiviert. Bei letzterem scheint dies nicht der Fall zu sein; zumindest war meine Suche nach 'Criticalsection' in der Unit HTTPProd erfolglos. Wenn ich mich recht erinnere, gibt es auf den Seiten von Embarcadero auch ein Beispiel dafür, wie man den Pageproducer einsetzt (und nicht nur da). Von Criticalsection war da nirgends was zulesen... Woher also kommt dieses seltsame verhalten?? Gruss Delbor PS: Ein Gedanke, bzw. einige nicht genügend beachtete Quelltextzeilen: Wenn der Browser im geladenen HTML ein src-Tag(..) findet, setzt er eine neue Anforderung ab. Hab ich übersehen, dass das Webmodul nach jeder Antwort deaktiviert und somit immer wieder neu aktiviert wird? Das würde bedeuten, dass auch eine Pageproducer.Content/Contentstream-Antwort eigentlich in einer Criticalsection abläüft...
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht. Frei nach Albert Einstein http://roase.ch |
Zitat |
Registriert seit: 9. Dez 2010 Ort: Mönchengladbach 1.737 Beiträge Delphi 6 Enterprise |
#6
Eigentlich sollte es so sein, das jeder Request für sich abgehandelt wird, ohne von vorhergehenden Request etwas wissen zu müssen. Dafür brauchst du da auch keine Critical Sections. Im Falle einer CGI-exe ist es ja sogar auch noch so, das für jeden Request die exe neu gestartet wird.
Ich würde einfach mal in jeder Webaction eine Dummy-Antwort zurückliefern lassen ala Response.Content='Webaction123', um zu sehen, ob wirklich die richtige Action feuert. Wenn das schon nicht klappt hast du ein Problem mit den Pathinfos oder im deinem Quellcode. Wenn es dagegen klappt, hast du vllt. ein Problem im Code der einzelen Webactions, z.B. bei der Auswahl der richtigen Page-Producer o.ä. Ohne den konkreten Code zu sehen, kann man da halt nichts genaueres zu sagen.
Ralph
|
Zitat |
Registriert seit: 8. Okt 2006 Ort: St.Gallen/Schweiz 1.186 Beiträge Delphi 11 Alexandria |
#7
Hi Jumpy
Zitat:
Eigentlich sollte es so sein, das jeder Request für sich abgehandelt wird, ohne von vorhergehenden Request etwas wissen zu müssen
Zitat:
PS: Ein Gedanke, bzw. einige nicht genügend beachtete Quelltextzeilen: Wenn der Browser im geladenen HTML ein src-Tag(..) findet, setzt er eine neue Anforderung ab. Hab ich übersehen, dass das Webmodul nach jeder Antwort deaktiviert und somit immer wieder neu aktiviert wird? Das würde bedeuten, dass auch eine Pageproducer.Content/Contentstream-Antwort eigentlich in einer Criticalsection abläüft...
Zitat:
Ich würde einfach mal in jeder Webaction eine Dummy-Antwort zurückliefern lassen ala Response.Content='Webaction123', um zu sehen, ob wirklich die richtige Action feuert. Wenn das schon nicht klappt hast du ein Problem mit den Pathinfos oder im deinem Quellcode.
Als nicht existierende Pathinfo verstehe ich eine solche, die theoretisch auf den ersten Blick korrekt erscheint, dies aber nicht ist, weil sie zuviele/zuwenige Zeichen enthält. Im Quellcode, so wie er in der Webmodul1-Unit steht, dürfte kaum ein Fehler sein - die Codeschnipsel der für HTML-Seiten zuständigen WebactionItems sind alle gleich. Das war auch bisher der Grund, warum ich mit Code bisher eher zurückhaltend war.
Delphi-Quellcode:
Soweit mal der Pascal-Quelltext. Die zuständigen PageProducer.HTMLFilepfade habe ich aus der Adresszeile des Explorers kopiert und um den Dateinamen ergänzt. Soweit ich das in Erinnerung habe, müssen dabei nicht mal die Backslashes ersetzt werden.
var
WebModuleClass: TComponentClass = TWebModule1; implementation {%CLASSGROUP 'Vcl.Controls.TControl'} {$R *.dfm} uses ServerMethodsUnit1, Web.WebReq, DSServerMainUnit; {-------------------------------OnAction-Events-------------------------------} procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin if Request.PathInfo = '/' then WebModule1WebActHomeAction(Self,Request,Response,Handled); if Request.PathInfo = '/html/DasWaldenburgerJuwel.html' then WebModule1WACWaldenburgerjuwelAction(Self,Request,Response,Handled); end; procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var PathInformation: String; begin PathInformation := Request.PathInfo; if Containstext(PathInformation, 'Images') then begin Self.ActionByName('WACImageItem').PathInfo := Request.PathInfo; // Hier wird ein WebactionItem aufgerufen,ddessen Pathinfoproperty end; // zur Entwurfszeit nicht belegt wurde und das jedes Bild - ob Handled := False; // Hintergrund oder Grafik - lädt. end; procedure TWebModule1.WebModule1WebActHomeAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := Self.PageProducerHome.Content; Response.SendResponse; end; procedure TWebModule1.WebModule1WACImageItemAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var fs : tFileStream; sFile : String; begin try sFile := 'E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer' + Request.PathInfo; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; end; finally fs.Free; end; end; procedure TWebModule1.WebModule1WACWaldenburgerjuwelAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducerWaldenburg.Content; Response.SendResponse; end; procedure TWebModule1.WebModule1WebActRomanticeRoadAction(Sender: TObject; // 2. Act Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducerRomanticRR.Content; Response.SendResponse; end; procedure TWebModule1.WebModule1WACBischofzellerRosenwocheAction( Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := Self.PageProducerRosenwochen.Content; Response.SendResponse; end; procedure TWebModule1.WebModule1WACFrhlingserwachenAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := Self.PageProducerFruehlingserwachen.Content; Response.SendResponse; end; procedure TWebModule1.WebModule1WACDSC_4414Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var fs : tFileStream; sFile : String; begin if Request.PathInfo = '/Images/DVZO/jpeg 250/DSC_4414.jpg' then begin try sFile := 'E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer' + Request.PathInfo; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; end; finally fs.Free; end; end; end; procedure TWebModule1.WebModule1WACDSC_4415Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var fs : tFileStream; sFile : String; begin if Request.PathInfo = '/Images/DVZO/jpeg 250/DSC_4415.jpg' then begin try sFile := 'E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer' + Request.PathInfo; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; end; finally fs.Free; end; end; end; procedure TWebModule1.WebModule1WebActBackgroundItem2Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var fs : tFileStream; sFile : String; begin if Request.PathInfo = '/Images/background/bgblue.jpg' then begin try sFile := 'E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer' + Request.PathInfo; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; end; finally fs.Free; end; end; end; // 4 . Act procedure TWebModule1.WebModule1WebActLogoitemAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var fs : tFileStream; sFile, BGdPath : String; begin try sFile := 'E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer' + Request.PathInfo; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; end; finally fs.Free; end; end; procedure TWebModule1.PageProducerBahnhofsFestWattwilHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin // Der hier fehlende Code fügt die CSS-Texte für das Seitenlayout und das Menue-CSS in dieSeiten ein 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; if tagstring = 'Requestausgabe' then ReplaceText := PageproducerRequest.Content; end; procedure TWebModule1.PageProducerLogoHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); var fs : tFileStream; sFile, BGdPath : String; begin try sFile := 'E:\DelphiXE8%20Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\Logo\Delbor_9_5.jpg'; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; end; finally fs.Free; end; end; procedure TWebModule1.PageProducerRomanticRRHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin if TagString = 'ROMANTICSPURCSS' then ReplaceText := Self.PageProducerFotoGaleryCSS.Content; //PageProducerRoundCol.Content; if Tagstring = 'MENUE' then ReplaceText := PageProducerMenueCSS.Content; end; procedure TWebModule1.PageProducerRosenwochenHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin if TagString = 'DELBORHOMECSS' then ReplaceText := PageProducerHomeCSS.Content; if TagString = 'ROMANTICSPURCSS' then ReplaceText := PageProducerHomeCSS.Content; if Tagstring = 'MENUE' then ReplaceText := PageProducerMenueCSS.Content; if Tagstring = 'Picture' then ReplaceText := PageProducerFotoGaleryCSS.Content; end; procedure TWebModule1.PageProducerWaldenburgHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin if TagString = 'DELBORHOMECSS' then ReplaceText := PageProducerHomeCSS.Content; if TagString = 'ROMANTICSPURCSS' then ReplaceText := PageProducerHomeCSS.Content; if Tagstring = 'MENUE' then ReplaceText := PageProducerMenueCSS.Content; if Tagstring = 'Picture' then ReplaceText := PageProducerFotoGaleryCSS.Content; end; procedure TWebModule1.WebModule1WebActionRequestAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Var Page : TStringList; begin Page := TStringList.Create; Try Page.Add('<html>'); Page.Add('<head>'); Page.Add('<title>'); Page.Add('Testseite'); Page.Add('</title>'); Page.Add('</head>'); Page.Add('<body>'); Page.Add('<hr />'); Page.Add('Request-Info<br /><br />'); Page.Add('Request.Accept: ' + Request.Accept + '<br />'); Page.Add('Request.Authorization: ' + Request.Authorization + '<br />'); Page.Add('Request.CacheControl: ' + Request.CacheControl + '<br />'); Page.Add('Request.Connection: ' + Request.Connection + '<br />'); Page.Add('Request.Content: ' + Request.Content + '<br />'); Page.Add('Request.ContentEncoding: ' + Request.ContentEncoding + '<br />'); Page.Add('Request.ContentFields.Text: ' + Request.ContentFields.Text + '<br />'); Page.Add('Request.ContentLength: ' + IntToStr(Request.ContentLength) + '<br />'); Page.Add('Request.ContentType: ' + Request.ContentType + '<br />'); Page.Add('Request.ContentVersion: ' + Request.ContentVersion + '<br />'); Page.Add('Request.Cookie: ' + Request.Cookie + '<br />'); Page.Add('Request.CookieFields.Text: ' + Request.CookieFields.Text + '<br />'); Page.Add('Request.Date: ' + DateToStr(Request.Date) + '<br />'); Page.Add('Request.DerivedFrom: ' + Request.DerivedFrom + '<br />'); Page.Add('Request.Expires: ' + DateToStr(Request.Expires) + '<br />'); Page.Add('Request.From: ' + Request.From + '<br />'); Page.Add('Request.Host: ' + Request.Host + '<br />'); Page.Add('Request.IfModifiedSince: ' + DateToStr(Request.IfModifiedSince) + '<br />'); Page.Add('Request.InternalPathInfo: ' + Request.InternalPathInfo + '<br />'); Page.Add('Request.InternalScriptName: ' + Request.InternalScriptName + '<br />'); Page.Add('Request.Method: ' + Request.Method + '<br />'); Page.Add('Request.PathInfo: ' + Request.PathInfo + '<br />'); Page.Add('Request.PathTranslated: ' + Request.PathTranslated + '<br />'); Page.Add('Request.ProtocolVersion: ' + Request.ProtocolVersion + '<br />'); Page.Add('Request.Query: ' + Request.Query + '<br />'); Page.Add('Request.QueryFields.Text: ' + Request.QueryFields.Text + '<br />'); Page.Add('Request.Referer: ' + Request.Referer + '<br />'); Page.Add('Request.RemoteAddr:' + Request.RemoteAddr + '<br />'); Page.Add('Request.RemoteHost: ' + Request.RemoteHost + '<br />'); Page.Add('Request.ScriptName: ' + Request.ScriptName + '<br />'); Page.Add('Request.ServerPort: ' + IntToStr(Request.ServerPort) + '<br />'); Page.Add('Request.URL: ' + Request.URL + '<br />'); Page.Add('Request.UserAgent: ' + Request.UserAgent + '<br />'); Page.Add('<hr>'); Page.Add('</body>'); Page.Add('</html>'); Page.Add(''); Page.Add(''); Response.Content := Page.Text; Response.SendResponse; finally Page.Free; end; end; procedure TWebModule1.DSAuthenticationManager1UserAuthenticate( Sender: TObject; const Protocol, Context, User, Password: string; var valid: Boolean; UserRoles: TStrings); begin valid := True; end; procedure TWebModule1.DSAuthenticationManager1UserAuthorize( Sender: TObject; EventObject: TDSAuthorizeEventObject; var valid: Boolean); begin valid := True; end; procedure TWebModule1.DSServerClass1GetClass( DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin PersistentClass := ServerMethodsUnit1.TServerMethods1; end; initialization finalization Web.WebReq.FreeWebModules; end. Für das beschriebene Phänomen scheint es also wirklich keinen Grund zu geben. Gruss Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht. Frei nach Albert Einstein http://roase.ch |
Zitat |
Registriert seit: 9. Dez 2010 Ort: Mönchengladbach 1.737 Beiträge Delphi 6 Enterprise |
#8
Hallo Delbor,
nur mal was mir auf die schnelle aufgefallen ist, als Kommentare in den Quellcode geschrieben:
Delphi-Quellcode:
{-------------------------------OnAction-Events-------------------------------}
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin if Request.PathInfo = '/' then WebModule1WebActHomeAction(Self,Request,Response,Handled); if Request.PathInfo = '/html/DasWaldenburgerJuwel.html' then WebModule1WACWaldenburgerjuwelAction(Self,Request,Response,Handled); end; //Wenn du hier die zur Request passende Action raussuchst und aufrufst, dann müssten da //aber doch eigentlich auch ein paar mehr stehen, oder? Die Anderen Actions werden sonst //doch gar nicht aufgerufen. //Auch die Sache mit dem 'Image' im Pathinfo würde ich dann eher hier unterbringen //Keine Ahnung ob das schon probiert hast, aber man könnte die Default-Handler Geschichte //aber auch weglassen, so dass die Anwendung alleine über die Pathinfo die richtige Webaction //(die wo halt die PathInfo passt) aufruft. procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var PathInformation: String; begin PathInformation := Request.PathInfo; if Containstext(PathInformation, 'Images') then begin Self.ActionByName('WACImageItem').PathInfo := Request.PathInfo; // Hier wird ein WebactionItem aufgerufen,ddessen Pathinfoproperty //So hier weist du der Action die zum Bild passende PathInfo zu, aber du ruft die Action nicht //auf, d.h. hier fehlt mMn ein aufruf ala: WebModule1WACImageItemAction(Self,Request,Response,Handled); //Beachte aber auch den drunter stehenden Kommentar. end; // zur Entwurfszeit nicht belegt wurde und das jedes Bild - ob Handled := False; // Hintergrund oder Grafik - lädt. end; //BeforeDispatch ist mMn hierfür nicht das richtige Event (s.o.). Im Before-Dispatch //könnte man den generierten Quellcode nochmal durchsuchen und Dinge darin ersetzen o.ä. procedure TWebModule1.WebModule1WACImageItemAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var fs : tFileStream; sFile : String; begin try sFile := 'E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer' + Request.PathInfo; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); //Hier nicht vllt. besser Response.ContenStream=fs Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; //Ein Bild wird vom Browser angefordert, was aus irgendeinem Grund nicht klappt //Da nützt es nix, HTML zu schicken, dass wird mMn nicht sinnvoll verarbeitet end; finally fs.Free; end; end; procedure TWebModule1.WebModule1WACWaldenburgerjuwelAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducerWaldenburg.Content; Response.SendResponse; end; //Generell: Warum immer das Response.SendResponse? //Das kann man doch weglassen. Man weist den Content zu, setzt ggf. noch Handled:=True und fertig. 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; if tagstring = 'Requestausgabe' then ReplaceText := PageproducerRequest.Content; end; //Der nächste Block hier macht gar keinen Sinn. Da sollen im PageProducerContent Tags //erstzt werden und keine Bilder verschickt werden. Ich denke das ist ein Relikt //aus der Entwicklung. Weg damit: procedure TWebModule1.PageProducerLogoHTMLTag(Sender: TObject; Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); var fs : tFileStream; sFile, BGdPath : String; begin try sFile := 'E:\DelphiXE8%20Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer\Images\Logo\Delbor_9_5.jpg'; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; end; finally fs.Free; end; end; //Ich denke das ist eine Test-Rückgabe-Funktion??? procedure TWebModule1.WebModule1WebActionRequestAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Var Page : TStringList; begin Page := TStringList.Create; Try Page.Add('<html>'); Page.Add('<head>'); Page.Add('<title>'); Page.Add('Testseite'); Page.Add('</title>'); Page.Add('</head>'); Page.Add('<body>'); Page.Add('<hr />'); Page.Add('Request-Info<br /><br />'); Page.Add('Request.Accept: ' + Request.Accept + '<br />'); Page.Add('Request.Authorization: ' + Request.Authorization + '<br />'); Page.Add('Request.CacheControl: ' + Request.CacheControl + '<br />'); Page.Add('Request.Connection: ' + Request.Connection + '<br />'); Page.Add('Request.Content: ' + Request.Content + '<br />'); Page.Add('Request.ContentEncoding: ' + Request.ContentEncoding + '<br />'); Page.Add('Request.ContentFields.Text: ' + Request.ContentFields.Text + '<br />'); Page.Add('Request.ContentLength: ' + IntToStr(Request.ContentLength) + '<br />'); Page.Add('Request.ContentType: ' + Request.ContentType + '<br />'); Page.Add('Request.ContentVersion: ' + Request.ContentVersion + '<br />'); Page.Add('Request.Cookie: ' + Request.Cookie + '<br />'); Page.Add('Request.CookieFields.Text: ' + Request.CookieFields.Text + '<br />'); Page.Add('Request.Date: ' + DateToStr(Request.Date) + '<br />'); Page.Add('Request.DerivedFrom: ' + Request.DerivedFrom + '<br />'); Page.Add('Request.Expires: ' + DateToStr(Request.Expires) + '<br />'); Page.Add('Request.From: ' + Request.From + '<br />'); Page.Add('Request.Host: ' + Request.Host + '<br />'); Page.Add('Request.IfModifiedSince: ' + DateToStr(Request.IfModifiedSince) + '<br />'); Page.Add('Request.InternalPathInfo: ' + Request.InternalPathInfo + '<br />'); Page.Add('Request.InternalScriptName: ' + Request.InternalScriptName + '<br />'); Page.Add('Request.Method: ' + Request.Method + '<br />'); Page.Add('Request.PathInfo: ' + Request.PathInfo + '<br />'); Page.Add('Request.PathTranslated: ' + Request.PathTranslated + '<br />'); Page.Add('Request.ProtocolVersion: ' + Request.ProtocolVersion + '<br />'); Page.Add('Request.Query: ' + Request.Query + '<br />'); Page.Add('Request.QueryFields.Text: ' + Request.QueryFields.Text + '<br />'); Page.Add('Request.Referer: ' + Request.Referer + '<br />'); Page.Add('Request.RemoteAddr:' + Request.RemoteAddr + '<br />'); Page.Add('Request.RemoteHost: ' + Request.RemoteHost + '<br />'); Page.Add('Request.ScriptName: ' + Request.ScriptName + '<br />'); Page.Add('Request.ServerPort: ' + IntToStr(Request.ServerPort) + '<br />'); Page.Add('Request.URL: ' + Request.URL + '<br />'); Page.Add('Request.UserAgent: ' + Request.UserAgent + '<br />'); Page.Add('<hr>'); Page.Add('</body>'); Page.Add('</html>'); Page.Add(''); Page.Add(''); Response.Content := Page.Text; Response.SendResponse; finally Page.Free; end; end; end.
Ralph
Geändert von Jumpy (30. Aug 2016 um 12:24 Uhr) |
Zitat |
Registriert seit: 8. Okt 2006 Ort: St.Gallen/Schweiz 1.186 Beiträge Delphi 11 Alexandria |
#9
Hi Jumpy
Delphi-Quellcode:
Tatsächlich hatte ich hier mal begonnen, wobei sichnach und nach eine komplette if-then-Kaskade ergeben hat, bis mir klar wurde, das die Items nur die übereinstimmende Pathinfo brauchen, um aufgrufen zu werden. Wie alle anderen, so verschwinden zu gegebener Zeit auch diese beiden Abfragen. Momentan zeigt mir ein Haltepunkt hier noch vor Abarbeitung des Items (oder eben auch nicht-Abarbeitung) den Wert von Pathinfo.
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin if Request.PathInfo = '/' then WebModule1WebActHomeAction(Self,Request,Response,Handled); if Request.PathInfo = '/html/DasWaldenburgerJuwel.html' then WebModule1WACWaldenburgerjuwelAction(Self,Request,Response,Handled); end; //Wenn du hier die zur Request passende Action raussuchst und aufrufst, dann müssten da //aber doch eigentlich auch ein paar mehr stehen, oder? Die Anderen Actions werden sonst //doch gar nicht aufgerufen. //Auch die Sache mit dem 'Image' im Pathinfo würde ich dann eher hier unterbringen //Keine Ahnung ob das schon probiert hast, aber man könnte die Default-Handler Geschichte //aber auch weglassen, so dass die Anwendung alleine über die Pathinfo die richtige Webaction //(die wo halt die PathInfo passt) aufruft.
Delphi-Quellcode:
Dieser Code stand anfangs im Defaulthändler, ohne Zuweisung an Item.Pathinfo, dafür mit Aufruf des entsprechenden Items. Nach meinen Infos ruft der Dispatcher jenes Item auf, dessen Pathinfo mit Request.Pathinfo übereinstimmt, weshalb ich das Item nicht aufzurufen brauche (und es auch nicht tun sollte), wenn dessen Pathinfo zugewiesen wurde.
procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var PathInformation: String; begin PathInformation := Request.PathInfo; if Containstext(PathInformation, 'Images') then begin Self.ActionByName('WACImageItem').PathInfo := Request.PathInfo; // Hier wird ein WebactionItem aufgerufen,ddessen Pathinfoproperty //So hier weist du der Action die zum Bild passende PathInfo zu, aber du ruft die Action nicht //auf, d.h. hier fehlt mMn ein aufruf ala: WebModule1WACImageItemAction(Self,Request,Response,Handled); //Beachte aber auch den drunter stehenden Kommentar. end; // zur Entwurfszeit nicht belegt wurde und das jedes Bild - ob Handled := False; // Hintergrund oder Grafik - lädt. end; //BeforeDispatch ist mMn hierfür nicht das richtige Event (s.o.). Im Before-Dispatch //könnte man den generierten Quellcode nochmal durchsuchen und Dinge darin ersetzen o.ä.
Delphi-Quellcode:
Damit habe ich einen Vorschlag hier aus dem Forum übernommen; der Code aus dem Exept-Abschnitt sollte wohl eher soweit abgeändert werden, dass eine (Melde-)Form angeezigt wird. Wenn überhaupt. Denn wen ein Bild nicht angezeigt/geladen werden kann, steht im Browser der alternative Text ('alt=Hier sollte..' oder was auch immer).
procedure TWebModule1.WebModule1WACImageItemAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var fs : tFileStream; sFile : String; begin try sFile := 'E:\DelphiXE8 Corner\DelphiXE8VclCorner\DelborWebserverXE8\DelborDataSnapServer' + Request.PathInfo; fs := tFileStream.Create(sFile,fmOpenRead); try Response.ContentType := 'image/jpeg'; Response.SendStream(fs); //Hier nicht vllt. besser Response.ContenStream=fs Response.SendResponse; except On e : Exception Do Response.Content := '<HTML><BODY>' + e.Message + '</BODY></HTML>'; //Ein Bild wird vom Browser angefordert, was aus irgendeinem Grund nicht klappt //Da nützt es nix, HTML zu schicken, dass wird mMn nicht sinnvoll verarbeitet end; finally fs.Free; end; end;
Delphi-Quellcode:
Auch das ist letzten Endes reines Copy&Paste - alle Items, die Seiten liefern, haben denselben Code. Aber ja - die erste Zeile würde genügen. Und Handled braucht man meines Wissens nur anzufassen, wenn die Weiterverarbeitung von einem andern Item fortgesetzt werden soll(Handled auf False setzen)
procedure TWebModule1.WebModule1WACWaldenburgerjuwelAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := PageProducerWaldenburg.Content; Response.SendResponse; end; //Generell: Warum immer das Response.SendResponse? //Das kann man doch weglassen. Man weist den Content zu, setzt ggf. noch Handled:=True und fertig.
Delphi-Quellcode:
Das ist so. Sie zeigt mir aber auch, dass in einem Item grundsätzlich alles möglich ist. Die steht vor allem desshalb noch da. Andere Testitems habe ich entfernt.
//Ich denke das ist eine Test-Rückgabe-Funktion???
procedure TWebModule1.WebModule1WebActionRequestAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Vielen Dank für deine Antwort! Darf ich dich mal nach deinen Ordnerstrukturen innerhalb deiner Webanwendung fragen? Es ist gut möglich, dass bei mir gerade da 'der Hund begraben' liegt. Im Anhang findest du ein Jpeg, das meine momentane Struktur zeigt. Gruss Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht. Frei nach Albert Einstein http://roase.ch |
Zitat |
Registriert seit: 9. Dez 2010 Ort: Mönchengladbach 1.737 Beiträge Delphi 6 Enterprise |
#10
Meine (und auch deine) Ordnerstruktur ist doch gar nicht wichtig. Deine Anwendung muss diese kennen, aber für die PathInfos ist das nicht entscheidend. Zumindest so wie du deine Anwendung aufbaust, so dass sie alles liefern kann (nicht nur HTML-Requests) sondern auch CSS, Images usw.
By the way kannst du bei CSS nicht genauso vorgehen, wie bei den Images, mit dem BeforeDispatch? Bei mir ist das so. Der Link enthält die künftige Pathinfo (Pic0), störe dich dabei nicht an dem Meine.exe. Das kommt daher, dass ich ja eine CGI.exe habe. Dann gibt es eine passende WebAction dazu mit der Pathinfo (Pic1). In der Webaction wird dann der PageProducer aufgerufen, und nur der!!! muss wissen, wo (bezogen auf die .exe) die HTML-Datei liegt (in meinem Fall im Unterordner "mod". (Pic2). Bei dir muss also das "/html/" nicht Teil der Pathinfo sein, wenn du es nicht willst. Nur deine PageProducer müssen wissen, das sie im Unterordner html gucken müssen (bzw. analog für css usw.).
Ralph
|
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |