Einzelnen Beitrag anzeigen

Delbor

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

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
Miniaturansicht angehängter Grafiken
ordnerstruktur.jpg  
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