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: 10939
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: 6865
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: 10939
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: 6865
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

PascalDragon
Beiträge: 965
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: fpHttpApp umstellen für IIS

Beitrag von PascalDragon »

icho2099 hat geschrieben: Di 8. Jul 2025, 15:37 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?
Statt den Weg über IIS Integration zu gehen, könntest du dich auch an den HTTP.SYS ranhängen. Das ist quasi der Kernelteil, der auch vom IIS genutzt wird, um HTTP Anfragen entgegen zu nehmen. FPC bietet hierzu die fpHTTPSys Unit an, welche sich transparent ins fcl-web einfügt. Ein Beispiel zur Verwendung findest du hier und weitere Informationen zur Konfiguration von HTTP.SYS findest du im MSDN.

Dies hat den Vorteil, dass du den gleichen HTTP Server benutzt, den auch IIS nutzt, ohne jedoch das Problem zu haben, dass du nicht einfach deinen Code neu kompilieren kannst, da der IIS deine Bibliothek in Beschlag hält.
icho2099 hat geschrieben: Di 8. Jul 2025, 15:37 Und kann man dann die bestehenden Funktionen weiterhin verwenden oder muss man alles neu machen?
Da es aktuell noch keine Einbindung für fcl-web gibt, müsstest da du entweder alles neu machen oder eben eine entsprechende Einbindung entwickeln.
FPC Compiler Entwickler

Antworten