AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi WebActionItems - oder kurz vor dem Durchdrehen
Thema durchsuchen
Ansicht
Themen-Optionen

WebActionItems - oder kurz vor dem Durchdrehen

Ein Thema von Delbor · begonnen am 22. Aug 2016 · letzter Beitrag vom 30. Aug 2016
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#1

AW: WebActionItems - oder kurz vor dem Durchdrehen

  Alt 29. Aug 2016, 12:40
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
  Mit Zitat antworten Zitat
Delbor

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

AW: WebActionItems - oder kurz vor dem Durchdrehen

  Alt 30. Aug 2016, 09:51
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
Das ist so.
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...
Hatte ich beim schreiben dieser Zeilen nur mal eben diesen Gedanken, der mir zunächst als nicht mit letzter Sicherheit begründet erschien, so ist das inzwischen anders.
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.
Das Problem ist nicht, das die falsche Seite (= falsche, aber existierende Pathinfo) angezeigt wird - je nach Pathinfo wird die überhaupt nicht angezeigt, und dann kann man sich den Seitenquelltext im Browser auch nicht über Rechtskllick->Seitenquelltext anzeigen lassen (Firefox - in anderen Browern lautet das entsprechende Item möglicherweise etwas anders).
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:
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.htmlthen
  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.jpgthen
  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.jpgthen
  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.jpgthen
  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 = 'DELBORHOMECSSthen
    ReplaceText := PageProducerHomeCSS.Content;
  if Tagstring = 'MENUEthen
    ReplaceText := PageProducerMenueCSS.Content;
  if tagstring = 'Requestausgabethen
    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 = 'ROMANTICSPURCSSthen
    ReplaceText := Self.PageProducerFotoGaleryCSS.Content; //PageProducerRoundCol.Content;
  if Tagstring = 'MENUEthen
    ReplaceText := PageProducerMenueCSS.Content;
end;

procedure TWebModule1.PageProducerRosenwochenHTMLTag(Sender: TObject; Tag: TTag;
  const TagString: string; TagParams: TStrings; var ReplaceText: string);
begin
  if TagString = 'DELBORHOMECSSthen
    ReplaceText := PageProducerHomeCSS.Content;
  if TagString = 'ROMANTICSPURCSSthen
    ReplaceText := PageProducerHomeCSS.Content;
  if Tagstring = 'MENUEthen
    ReplaceText := PageProducerMenueCSS.Content;
  if Tagstring = 'Picturethen
    ReplaceText := PageProducerFotoGaleryCSS.Content;
end;

procedure TWebModule1.PageProducerWaldenburgHTMLTag(Sender: TObject; Tag: TTag;
  const TagString: string; TagParams: TStrings; var ReplaceText: string);
begin
  if TagString = 'DELBORHOMECSSthen
    ReplaceText := PageProducerHomeCSS.Content;
  if TagString = 'ROMANTICSPURCSSthen
    ReplaceText := PageProducerHomeCSS.Content;
  if Tagstring = 'MENUEthen
    ReplaceText := PageProducerMenueCSS.Content;
  if Tagstring = 'Picturethen
    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.
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.
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
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: WebActionItems - oder kurz vor dem Durchdrehen

  Alt 30. Aug 2016, 11:22
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.htmlthen
  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 = 'DELBORHOMECSSthen
    ReplaceText := PageProducerHomeCSS.Content;
  if Tagstring = 'MENUEthen
    ReplaceText := PageProducerMenueCSS.Content;
  if tagstring = 'Requestausgabethen
    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 11:24 Uhr)
  Mit Zitat antworten Zitat
Delbor

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

AW: WebActionItems - oder kurz vor dem Durchdrehen

  Alt 30. Aug 2016, 12:29
Hi Jumpy
Delphi-Quellcode:
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.htmlthen
  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.
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.

Delphi-Quellcode:
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.ä.
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.

Delphi-Quellcode:
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;
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).

Delphi-Quellcode:
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.
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)

Delphi-Quellcode:
//Ich denke das ist eine Test-Rückgabe-Funktion???
procedure TWebModule1.WebModule1WebActionRequestAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
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.

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
Angehängte Grafiken
Dateityp: jpg Ordnerstruktur.JPG (49,3 KB, 5x aufgerufen)
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
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: WebActionItems - oder kurz vor dem Durchdrehen

  Alt 30. Aug 2016, 13:17
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.).
Angehängte Grafiken
Dateityp: jpg Pic0.JPG (19,6 KB, 2x aufgerufen)
Dateityp: jpg Pic1.JPG (20,6 KB, 8x aufgerufen)
Dateityp: jpg Pic2.JPG (18,5 KB, 8x aufgerufen)
Ralph
  Mit Zitat antworten Zitat
Delbor

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

AW: WebActionItems - oder kurz vor dem Durchdrehen

  Alt 30. Aug 2016, 13:51
Hi Jumpy
Zitat:
By the way kannst du bei CSS nicht genauso vorgehen, wie bei den Images, mit dem BeforeDispatch?
Als ich das das erste mal im Defaulthandler ausprobierte - ich hatte es mit eigenen Items versucht, aber bei dutzenden Bildern pro Seite ist das natürlich Quatsch - wollte ich das auch für ganze Seiten umsetzen, was erstmal schief ging. Mit den CSS-Texten sollte es eigentlich möglich sein.
Im Moment werden die noch in den OnHtmlTag-Events in die Seite eingefügt, was mir im Grunde nicht sonderlich gefällt.

Durch Angabe der CSS-Quelldateien ist es meines Wissens möglich, dass der Browser die Seite formatiert, ohne das CSS in die Seite einzubinden (im OnBeforeDispatch?) Das führt aber bei jedem DIV und bei jeder Klasse zu einer neuen Abfrage (denk ich mal wenigstens). Und da stellt sich docjh die Frage, was letzten Endes effdizienter ist.

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
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: WebActionItems - oder kurz vor dem Durchdrehen

  Alt 30. Aug 2016, 14:42
Hi Jumpy
Durch Angabe der CSS-Quelldateien ist es meines Wissens möglich, dass der Browser die Seite formatiert, ohne das CSS in die Seite einzubinden (im OnBeforeDispatch?) Das führt aber bei jedem DIV und bei jeder Klasse zu einer neuen Abfrage (denk ich mal wenigstens). Und da stellt sich docjh die Frage, was letzten Endes effdizienter ist.
So ist das eigentlich nicht. Wenn du die CSS-Datei in der HTML-Datei als einbindest, bei mir sieht das z.B. so aus:

<link rel="stylesheet" href="../CSS2_Muster.css" media="all">

dann lädt der Browser diese CSS-Datei einmalig nach, d.h. er fordert sie 1x beim Webserver an.


Es ist nicht so, dass erdie für jedes div oder sonstige HTML-Element jedes mal neu laden müsste!
Ralph
  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 20:51 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