fpHttpApp umstellen für IIS

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
icho2099
Beiträge: 50
Registriert: Fr 21. Feb 2020, 19:17
OS, Lazarus, FPC: Win10/64
CPU-Target: 64 Bit
Wohnort: Osterholz-Scharmbeck

fpHttpApp umstellen für IIS

Beitrag von icho2099 »

Hallo,
ich habe eine Anwendung mit fpHttpApp. Das Grundgerüst funktioniert:

Code: Alles auswählen

uses
    sysutils
  , fpHttpApp
  , httpdefs
  , httproute 
  ;
  
Procedure DoKill(Req: TRequest; Resp: TResponse);
begin
  Resp.Content := 'server down';
  Application.Terminate;
end;

begin
  HTTPRouter.RegisterRoute('kill'        , @DoKill);    
  
  
  Application.Title    := 'XYZ';
  Application.Port     := webPort;
  Application.Threaded := True;
  Application.Initialize;
  Application.Run;   
end.  
Es gibt weitere registrierte Routen und dazugehörige Funktionen, soweit läuft das zufriedenstellend.
Aber nun soll das keine eigenständige App mehr sein sondern in einem MS IIS laufen.
Da fehlt mir aber jedwede Erfahrung und Praxis.
Was nimmt man da, CGI Application, oder Fast CGI Application? Apache Module wohl eher nicht, oder?

Und kann man dann die bestehenden Funktionen weiterhin verwenden oder muss man alles neu machen?
Würde mich über ein paar praktische Tipps sehr freuen.

Benutzeravatar
theo
Beiträge: 10938
Registriert: Mo 11. Sep 2006, 19:01

Re: fpHttpApp umstellen für IIS

Beitrag von theo »

Das habe ich vor gefühlt 100 Jahren mal gemacht. Vielleicht hilft dir das:
https://www.gocher.me/ISAPI

Vielleicht macht man das jetzt nicht mehr so, k.A.
IIS benutze ich schon länger nicht mehr.

Mathias
Beiträge: 6972
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: fpHttpApp umstellen für IIS

Beitrag von Mathias »

Ist ISAPI etwas ähnliche wie microhttpd ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 398
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: fpHttpApp umstellen für IIS

Beitrag von Jorg3000 »

theo hat geschrieben: Di 8. Jul 2025, 16:24 Das habe ich vor gefühlt 100 Jahren mal gemacht. Vielleicht hilft dir das:
https://www.gocher.me/ISAPI
Vielen vielen Dank, denn ISAPI kannte ich nicht - und nach meinem ersten Test gestern, ist es genau das, was ich für mein neues HTML5/JS-Projekt für meine Windows-nutzenden Firmenkunden im Intranet super gebrauchen kann.
Mathias hat geschrieben: Di 8. Jul 2025, 18:28 Ist ISAPI etwas ähnliche wie microhttpd ?
Unter dem Begriff microhttpd habe ich zwei Projekte gefunden, die beide darauf abzielen, einen eigenen kleinen Server zu betreiben bzw. als Lib in eigene Programme zu integrieren.

ISAPI ist genau das Gegenteil, d.h. eine selbstprogrammierte DLL wird vom Windows IIS integriert, d.h. der IIS ist der Webserver und die DLL liefert die Responses, ohne dass man PHP o.ä. benötigt.
Ein großer Nachteil ist, dass ISAPI nur mit dem Microsoft IIS funktioniert. Aber ebenso haben andere Webserver eigene Modul-Schnittstellen, die ebenfalls nicht von anderen Webservern unterstützt werden.

ISAPI hat zwei große Vorteile: Es braucht bei einem Aufruf kein neuer Prozess gestartet zu werden, weil die DLL bereits geladen ist - somit sind die Aufrufe viel schneller.
Außerdem kann die DLL den Hauptspeicher und Datenbank-Verbindungen persistent nutzen (bis zum nächsten Neustart des IIS), somit kann die DLL wie ein Application Server agieren (ebenfalls sehr schnell).

Sobald ich es weiter getestet habe, schreibe ich eine Schritt für Schritt-Anleitung für ISAPI, die auf die Unit von Theo verlinkt. Theo: Ist es deine eigene Unit oder ein Link, den du gefunden hast?
Grüße, Jörg

nummer8
Beiträge: 56
Registriert: Sa 30. Apr 2016, 10:20
OS, Lazarus, FPC: Windows 8 -11 ; linux Debian 12; Mac
CPU-Target: 32bit 64bit

Re: fpHttpApp umstellen für IIS

Beitrag von nummer8 »

Vor Jahren habe ich ISAPI-Anwendungen erstellt.
Nachfolgend ein Stück Pseudocode zur Behandlung von Cookies.
Sie können es leicht in Ihr eigenes Projekt einbauen.
Vielleicht ist es hilfreich.

Code: Alles auswählen

function HttpExtensionProc(var pECB: TEXTENSION_CONTROL_BLOCK): DWORD; stdcall;
//...
  function ServerVariables(const AName: RawByteString): RawByteString;
  var dwSize: DWORD;
  begin
    dwSize := 4096;
    SetLength(Result, dwSize);
    if pECB.GetServerVariable(pECB.ConnID, PAnsiChar(AName), PAnsiChar(Result), dwSize) or
       pECB.GetServerVariable(pECB.ConnID, PAnsiChar('HTTP_' + AName), PAnsiChar(Result), dwSize) or
       pECB.GetServerVariable(pECB.ConnID, PAnsiChar('HTTP_X_' + AName), PAnsiChar(Result), dwSize) then
      SetLength(result, dwSize-1)
  end;
//...
var
  sCookie, setCookie, sessionid: RawByteString;
  newsession: boolean;
//...
begin
  //...
  // at the begin of request handling
  // get cookies comes back from client (for example sessionid)
  sCookie := ServerVariables('COOKIE');

  // search for your session key (in this example SESSIONID)
  sessionid := '';
  newsession := false;
  if pos('SESSIONID=', sCookie)>0 then
  begin
    sessionid := copy(sCookie, pos('SESSIONID=', sCookie)+10);
    if pos(';', sessionid)>0 then
      sessionid := copy(sessionid, 1, pos(';', sessionid)-1);
    // load the session values from a session file to the session list
    // if no file found (for example after timeout you must delete your file)
    // reset sessionid := '';
  end;
  // if no sessionid found or session is out of date create a new key
  if sessionid = '' then
  begin
    newsession := true;
    sessionid := '12345678901234567890';
  end;

  // get cookies set by client
  setCookie := ServerVariables('SET_COOKIE');
  // add cookies to the session list

  // now you can work with the session list

  // save the session list to the session file

  sResponse := 'HTTP/1.1 '+ IntToStr(HTTPStatusCode) + #13#10 +
               'Content-Type: text/html' + #13#10 +
               'Content-Length: ' + Format('%d', [Length(sResponse)]) + #13#10 +
               BoolToStr(newsession, 'Set-', '') + 'Cookie: ' + 'SESSIONID=' + sessionid + #13#10 +
               'Content:'#13#10#13#10 + sResponse;
end;
Ich werde nachsehen, ob ich irgendwo noch ein weiteres vollständiges funktionierendes Projekt finden kann.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6863
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpHttpApp umstellen für IIS

Beitrag von af0815 »

Ich habe da noch aus meiner ISAPI Delphi-Schulung noch im Kopf das man sich überlegen muss, welches Thread Modell man verwendet, auch in Hinblick auf die Sicherheit, besonders dann wenn man auf lokale Dateien zugreift. Mir ist hängen geblieben, das der InProcess Thread auch den IIS mitreissen kann.

Ein paar Infos dazu: https://learn.microsoft.com/en-us/previ ... 1(v=vs.90)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10938
Registriert: Mo 11. Sep 2006, 19:01

Re: fpHttpApp umstellen für IIS

Beitrag von theo »

Jorg3000 hat geschrieben: Mi 9. Jul 2025, 06:54 Theo: Ist es deine eigene Unit oder ein Link, den du gefunden hast?
Ich hatte das damals auf Win2k Server noch mit Delphi gemacht.
Ist echt lange her.
Mit der verlinkten Website habe ich nichts zu tun.

icho2099
Beiträge: 50
Registriert: Fr 21. Feb 2020, 19:17
OS, Lazarus, FPC: Win10/64
CPU-Target: 64 Bit
Wohnort: Osterholz-Scharmbeck

Re: fpHttpApp umstellen für IIS

Beitrag von icho2099 »

theo hat geschrieben: Di 8. Jul 2025, 16:24 Das habe ich vor gefühlt 100 Jahren mal gemacht. Vielleicht hilft dir das:
https://www.gocher.me/ISAPI

Vielleicht macht man das jetzt nicht mehr so, k.A.
IIS benutze ich schon länger nicht mehr.
Besten Dank,
das scheint doch noch deutlich komplexer zu sein als befürchtet.
Vor allem der Entwicklungszyklus, mit vielen Änderungen der dll macht mir Sorge.
Bei laufendem IIS wird sich die dll wohl nicht so einfach auswechseln lassen.

nummer8
Beiträge: 56
Registriert: Sa 30. Apr 2016, 10:20
OS, Lazarus, FPC: Windows 8 -11 ; linux Debian 12; Mac
CPU-Target: 32bit 64bit

Re: fpHttpApp umstellen für IIS

Beitrag von nummer8 »

Sobald die DLL einmal aufgerufen wurde, bleibt sie durch den IIS gesperrt.
Um die DLL auszutauschen, muss man die Website ausschalten.
Während der Entwicklung habe ich immer ein lokales ISS verwendet, das ich beim Wechsel der DLL komplett abschaltete.
Es gibt noch weitere Methoden, um die DLL zu ändern, aber dies ist die einfachste.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6863
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpHttpApp umstellen für IIS

Beitrag von af0815 »

icho2099 hat geschrieben: Mi 9. Jul 2025, 12:56 Bei laufendem IIS wird sich die dll wohl nicht so einfach auswechseln lassen.
InProcess ist die gelockt, da hilft nur der ShutDown des IIS. Nachdem der IIS mittlerweile auch in den anderen Varianten ein Pooling macht, wird dir nichts anderes überbleiben, als den Prozess immer wieder zu restarten. Vielleicht geht der isolationlevel high noch bei deinem IIS und da hast du eine chance nach kurzer Zeit die dll zu tauschen. Das heisst, die alte Version umbenennen und die neue einzuspielen. Wenn du Glück hast, wird dann die neue Version genommen. Und dann lässt sich die alte Version löschen. Vor Jahrzehnten ging beim IIS der Trick noch. Kann sein, das da nichts mehr geht

Ein paar Informationen dazu hier. https://www.west-wind.com/presentations/iis5debug.htm
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 398
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: fpHttpApp umstellen für IIS

Beitrag von Jorg3000 »

IIS stoppen und wieder starten:
Für meine ersten Tests habe ich gestern folgende Batch-Datei (.bat) verwendet, die sich mit Admin-Rechten neu aufruft (User-Bestätigung) und dann den IIS stoppt.
Eine Kopie der Datei startet den IIS, indem die Zeile iisreset /stop durch iisreset /start ersetzt wird. Der Vorgang dauert nur Sekunden.
Man könnte in die Batch-Datei vor dem IIS-Start noch ein "copy" für die DLL vom Compile-Ordner zum Web-Ordner einbauen.

Code: Alles auswählen

@echo off

:: Check if the batch is running with administrator privileges

net session >nul 2>&1
if %errorlevel% neq 0 (
    echo Starting with administrator privileges ...
    powershell -Command "Start-Process -Verb runAs -FilePath '%~f0'"
    exit /b
)

@echo on
:: The batch is running with administrator privileges.

iisreset /stop

pause

Antworten