Start Mini Webserver
Zuletzt geändert: 14.03.2026 05:56

Start-MiniWebserver #

ÜBERSICHT #

Startet einen lokalen Mini-HTTP/HTTPS-Webserver zum Ausliefern statischer Dateien und Bereitstellen einfacher CRUD-APIs (z.B. Partner-Verwaltung) mit optionaler Anzeige im Chrome-App-Modus.

SYNTAX #

Start-MiniWebserver [[-Protocol] <string>] [[-HostName] <string>] [[-Port] <string>]
    [-RedirectToHttps] [[-RedirectFromPort] <string>] [-NoBrowser] [-NoAuth] [[-ConnStr] <string>]
    [[-MailDraftId] <string>] [[-StartPage] <string>] [<CommonParameters>]

BESCHREIBUNG #

Start-MiniWebserver richtet einen HttpListener auf dem angegebenen Host und Port ein und liefert Dateien (HTML, CSS, JS, JSON, Images etc.) aus dem Modul-Verzeichnis aus. Zusätzlich stehen vordefinierte Endpunkte (/partners, /partner/{name}, /ediHubs, /syntaxcheck, /shutdown) zur Verfügung, um Partner-Daten per REST (GET, PUT, POST, DELETE) zu verwalten sowie EDI-Syntaxprüfungen durchzuführen.

Statische Dateien #

  • Werden im Verzeichnis zurückgeliefert, das Get-EulandaXtoolsPath (Modulpfad) zurückgibt.
  • CSS-, JS- und HTML-Inhalte werden vor dem Versand per Minify-Funktionen komprimiert.
  • JSON-Dateien und alle anderen Dateitypen (Bilder, Fonts, Icons) werden direkt ausgeliefert.

Dynamische Endpunkte #

  • GET /partners → JSON-Liste aller Partnernamen (Funktion: Get-EdifactPartnerList).
  • GET /partner/{name} → Details zu einem Partner als JSON (Invoke-MiniWebserver-HandleGetPartnerDetail).
  • PUT /partner/{name} → Update/Anlegen eines Partners (Invoke-MiniWebserver-HandlePutPartner).
  • POST /partner → Anlegen eines neuen Partners (Invoke-MiniWebserver-HandlePutPartner).
  • DELETE /partner/{name} → Löschen eines Partners (Invoke-MiniWebserver-HandleDeletePartner).
  • GET /ediHubs → JSON-Liste aller EDI-HUBs (hardcodiert oder über Datenbank).
  • POST /syntaxcheck → Upload einer EDI-Datei und Rückgabe eines HTML-Syntax-Reports (Invoke-MiniWebserver-HandleSyntaxCheck).
  • POST /shutdown → Sauberes Herunterfahren des Servers (Invoke-MiniWebserver-HandleShutdown).
  • GET /debug → Debug-JSON mit Session-Informationen.

Sitzungs-Management #

  • Session-IDs werden per Cookie und lokalen Storage synchronisiert.
  • SessionMap und SessionQueue begrenzen die Anzahl paralleler Sessions (Max 1000).

Authentifizierung (Standard, wenn -NoAuth nicht gesetzt) #

  • Basic-Auth (Header “Authorization: Basic ”) gegen eine interne Hashtable ($script:ValidUsers).
  • Bearer-Token (Header “Authorization: Bearer soleBlaAptusWenX”) ist alternativ möglich.
  • Bei fehlerhaften Anmeldungen wird Lockout-Logik angewendet: · Sperrung nach 10 Fehlversuchen pro IP (30 Sekunden Lockout) oder pro Account (60 Sekunden Lockout).
  • Erfolgreiche Logins setzen Zähler zurück. Fehler führen zu HTTP 401 mit WWW-Authenticate-Header.

Redirect HTTP → HTTPS (wenn -RedirectToHttps und -Protocol ‘https’ gesetzt) #

  • Ein zusätzlicher HttpListener auf Port $RedirectFromPort (Standard 80) leitet alle HTTP-Anfragen per 301-Redirect auf https://$HostName:$Port/ weiter.
  • Damit funktioniert beispielsweise: $listener.Prefixes.Add(“http://$HostName:$RedirectFromPort/”) … 301 Location: https://$HostName:$Port$Request.PathAndQuery

Browser-App-Modus (Standard, wenn -NoBrowser nicht gesetzt) #

  • Startet Google Chrome mit –app="$Protocol://$HostName:$Port/".
  • Sobald der Chrome-Prozess schließt, wird der Webserver automatisch gestoppt.

Wildcard-Binding für LAN-Zugriff (wenn $HostName=’*’ oder ‘+’) #

  • HttpListener.Prefixes.Add(“http://*:8080/”) oder “http://+:8080/” bedient alle Interfaces.
  • Erfordert vorherige URL-ACL-Reservierung als Administrator: $io = whoami netsh http add urlacl url=http://*:8080/ user=$io netsh http add urlacl url=http://+:8080/ user=$io
  • Firewall-Regel für Port 8080 inbound beispielhaft öffnen: netsh advfirewall firewall add rule name=“Open Port 8080” dir=in action=allow protocol=TCP localport=8080

HTTPS-Konfiguration #

  • Zunächst PFX-Zertifikat importieren: $secPwd = ConvertTo-SecureString ‘DeinPfxPasswort’ -AsPlainText -Force Import-PfxCertificate -FilePath ‘C:\Pfad\zum<Zertifikat>.pfx’ -CertStoreLocation ‘Cert:\LocalMachine\My’ -Password $secPwd
  • Thumbprint ermitteln: Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -like ‘CN=’ } | Select-Object Thumbprint
  • SSL-Bindung einrichten: $appId = [guid]::NewGuid().ToString() netsh http add sslcert ipport=0.0.0.0: certhash= appid="{$appId}"
  • Eventuelle URL-ACLs für https:// müssen analog zu http:// angelegt werden: netsh http add urlacl url=https://$HostName:/ user=$io
  • Firewall-Regeln für Ports 80/443 öffnen: netsh advfirewall firewall add rule name=“Open Port 80” dir=in action=allow protocol=TCP localport=80 netsh advfirewall firewall add rule name=“Open Port 443” dir=in action=allow protocol=TCP localport=443

PARAMETER #

-Protocol #

Type: string
Default: 'http'

Gibt das Protokoll an (‘http’ oder ‘https’). Standardmäßig ‘http’. Wenn ‘https’, muss zuvor eine gültige SSL-Bindung (netsh http add sslcert) eingerichtet sein.

-HostName #

Type: string
Default: 'localhost'

Hostname oder IP-Adresse, auf dem/der der Server lauscht. Standard ’localhost’. Setze ‘*’ oder ‘+’ für Wildcard-Binding (LAN-Zugriff), erfordert aber Admin-URL-ACL.

-Port #

Type: string
Default: 8080

Portnummer, auf dem der HttpListener gestartet wird. Standard 8080. Bei HTTPS sollte hier üblicherweise 443 (oder ein anderer freier SSL-Port) stehen.

-RedirectToHttps #

Type: switch

Wenn gesetzt und Protocol=‘https’, wird zusätzlich ein HTTP-Listener auf RedirectFromPort (Standard 80) gestartet, der alle HTTP-Anfragen per 301 weiterleitet.

-RedirectFromPort #

Type: string
Default: '80'

Port, auf dem HTTP-Listener für Redirect lauscht. Nur relevant, wenn -RedirectToHttps und Protocol=‘https’ gewählt. Standard ist ‘80’.

-NoBrowser #

Type: switch

Unterdrückt das automatische Öffnen von Google Chrome im App-Modus. Der Server läuft nur in der Konsole, bis er per STRG+C oder POST /shutdown beendet wird.

-NoAuth #

Type: switch

Deaktiviert die eingebaute Basic-/Bearer-Authentifizierung. Falls gesetzt, kann jeder Benutzer ohne Credentials auf alle Endpunkte zugreifen.

-ConnStr #

Type: string

Connection-String zur Datenbank, beispielsweise: "Server=DBServer;Database=MeinDB;User Id=...;Password=...;. Wird benötigt für alle Partner-Funktionen wie GET, PUT. POST und DELETE-Handler (Invoke-MiniWebserver-HandleGetPartnerDetail, Invoke-MiniWebserver-HandlePutPartner, Invoke-MiniWebserver-HandleDeletePartner).

-MailDraftId #

Type: string

(Optional) Draft-ID einer zu bearbeitenden E-Mail. Wird vom Modul für modale E-Mail-Dialoge gesetzt. Wenn angegeben, liefert der Server automatisch die passende Draft-Datei über /drafts/{id} aus und nimmt Änderungen an /sendmail entgegen.

-StartPage #

Type: string
Default: "partner.html"

(Optional) Startseite, die direkt im Browser geöffnet werden soll. Standard ist ‘partner.html’, für den E-Mail-Dialog z.B. ’email.htm’.

BEISPIELE #

# Startet lokalen HTTP-Server auf localhost:8080, öffnet Chrome im App-Modus
Start-MiniWebserver -ConnStr "Server=SQL01;Database=EDI;User Id=sa;Password=Secret123;"
# Startet reinen Konsolen-Webserver ohne Browser, mit Basic-Auth deaktiviert
Start-MiniWebserver -ConnStr "Server=SQL01;Database=EDI;User Id=sa;Password=Secret123;" -NoBrowser -NoAuth
# Startet HTTPS-Server auf Port 443, leitet Port 80 automatisch auf HTTPS weiter, ohne Browser
Start-MiniWebserver -Protocol 'https' -HostName 'www2.eulanda.eu' -Port 443 `
    -RedirectToHttps -RedirectFromPort 80 -NoBrowser `
    -ConnStr "Server=SQL01;Database=EDI;User Id=sa;Password=Secret123;"

# Admin-Vorbereitungen (einmalig):
$io = whoami
# SSL-Zertifikat importieren und Thumbprint ermitteln
$secPwd = ConvertTo-SecureString 'DeinPfxPasswort' -AsPlainText -Force
Import-PfxCertificate -FilePath 'C:\Users\cn\Desktop\STAR.eulanda.eu.pfx' `
    -CertStoreLocation 'Cert:\LocalMachine\My' -Password $secPwd
$thumb = (Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -like 'CN=*.eulanda.eu' }).Thumbprint
$appId = [guid]::NewGuid().ToString()
netsh http add sslcert ipport=0.0.0.0:443 certhash=$thumb appid="{$appId}"
# URL-ACLs setzen
netsh http add urlacl url=https://www2.eulanda.eu:443/ user=$io
netsh http add urlacl url=http://www2.eulanda.eu:80/ user=$io
# Firewall-Regeln aktivieren
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80
netsh advfirewall firewall add rule name="Open Port 443" dir=in action=allow protocol=TCP localport=443

HINWEISE #

  • Erfordert PowerShell 5.x oder höher.
  • Setzt ein gültiges Modul EulandaXtools voraus (mit Get-EulandaXtoolsPath usw.), Dort liegen dann die statischen Dateien enthält.
  • Sind keine statischen Dateien wie mws_script.js usw. vorhanden, werden sie aus Ressourcen (here-strings) verwendet.
  • Beim Einsatz im LAN: URL-ACLs und Firewall-Regeln unbedingt als Administrator einmalig anlegen.
  • Sämtliche Minify-Funktionen (ConvertTo-MinifyStyleSheet, ConvertTo-MinifiedJavaScript, ConvertTo-MinifiedHtml) und Helper-Funktionen (Get-OrCreateSessionId, Invoke-MiniWebserver-Handle*, Send-TextResponse, Get-EdifactPartnerList, Get-MiniWebserverPartner, Get-MiniWebserverFavicon, Get-MiniWebServerStyleSheet, Get-MiniWebserverJavaScript) müssen im Modul vorhanden sein.
  • Mit STRG+C oder per POST /shutdown (z. B. Invoke-RestMethod -Method Post http://localhost:8080/shutdown) kann der Server sauber beendet werden.