Live-Demos

Diese Seite läuft auf dem Stack, mit dem ich arbeite.

.NET 10, Blazor, EF Core, Azure SQL und Azure App Service. Jede Demo hier ist echt, läuft live auf dem Server oder in Ihrem Browser – und verlinkt ihren Quelltext.

Drei Arten, eine Komponente auszuführen

Blazor kann Komponenten statisch auf dem Server rendern, interaktiv über SignalR betreiben oder komplett im Browser per WebAssembly ausführen. Hier laufen alle drei Varianten nebeneinander auf derselben Seite.

  • Statisches SSR mit Enhanced Forms – ganz ohne dauerhafte Verbindung
  • InteractiveServer: UI-Logik auf dem Server, DOM-Diffs über WebSocket
  • InteractiveWebAssembly: .NET-Runtime im Browser, Zustand per [PersistentState] übergeben
Quelltext auf GitHub
Static SSR

Klassisch vom Server

HTML wird pro Anfrage auf dem Server erzeugt – schnell, suchmaschinenfreundlich und ganz ohne dauerhafte Verbindung.

Kein WebSocket, kein WebAssembly
Renderer
Static
Interaktiv
nein – nur HTML
Gerendert
12:01:56.603 Uhr
Transport
HTTP POST + Enhanced Navigation
0 Formular-Post

Jeder Klick schickt ein Formular. Blazor lädt die Antwort per fetch und tauscht nur die geänderten DOM-Teile aus – die Seite springt nicht und die anderen Demos laufen weiter.

InteractiveServer

Interaktiv über SignalR

Die Komponente läuft auf dem Server. Der Browser bekommt nur die DOM-Änderungen über eine WebSocket-Verbindung.

Vorgerendert – Verbindung wird aufgebaut …
Renderer
Static
Server
Azure App Service · germanywestcentral
Betriebssystem
Ubuntu 24.04.5 LTS
Runtime
.NET 10.0.12
Serverzeit
12:01:56.603 Uhr
0 Roundtrip zum Server

Klick und Uhrzeit laufen über den Server: Event hin, neu rendern, nur der Unterschied zurück. Ideal für Business-Anwendungen mit direktem Zugriff auf Datenbank und Dienste.

InteractiveWebAssembly

.NET im Browser

Die Komponente wird vorgerendert und dann von der .NET-Runtime in Ihrem Browser übernommen.

Vorgerendert – .NET-Runtime wird geladen …
Renderer
Static
Betriebssystem
Ubuntu 24.04.5 LTS
Architektur
X64
Runtime
.NET 10.0.12
Vorgerendert
11:01:56 UTC · Ubuntu 24.04.5 LTS
0

Jeder Klick wird lokal im Browser verarbeitet – kein Netzwerk, keine Server-Last. [PersistentState] überträgt den Zeitpunkt des Prerenderings vom Server in den Browser.

SPS-Simulator mit HMI

Mein Hintergrund in der Automatisierung, umgesetzt mit .NET: Jeder Besucher bekommt eine eigene Soft-SPS, die eine Tankanlage steuert. Der Funktionsbaustein ist Zeile für Zeile aus SCL übertragen, das Bedienbild orientiert sich an WinCC.

  • Zyklischer Scan alle 100 ms mit Prozessabbild (PAE/PAA) und Analogwert-Skalierung wie in der S7
  • Zweipunktregelung, Verriegelungen, NOT-HALT, Überfüllsicherung und Meldesystem mit Quittierung
  • SCL-Original und laufender C#-Quelltext direkt im Simulator einsehbar
Quelltext auf GitHub
TANKANLAGE T1 AUTO Anlage EIN Störung SPS #9FB8 12:01:56
Zulauf T1 · 2.000 l 42 % 840 l 050100 HH 95 H 80 L 20 TL 8 LSHH LIT 101 42,0 % P1 AUS 0 l/min V1 0 l/min Abnahme

Verbindung zur Soft-SPS wird aufgebaut …

Betriebsart
Anlage
Handbetrieb
Meldungen
Keine anstehenden Meldungen
Trend · letzte 60 Sekunden
  • Füllstand LT101
  • Pumpe P1 · %Q0.0
  • Ventil V1 · %Q0.1

Der Trend startet, sobald die CPU läuft.

Letzte Werte als Tabelle
ZeitFüllstandPumpe P1Ventil V1
Eingänge (PAE)
AdresseSymbolKommentarWert
%I0.0 "Start" Taster Start (Schließer) 0
%I0.1 "Stop" Taster Stop (Öffner) 1
%I0.2 "NotHalt_OK" NOT-HALT-Kreis geschlossen 1
%I0.3 "Quittieren" Taster Quittieren 0
%I0.4 "Auto" Wahlschalter AUTO/HAND 1
%I0.5 "Hand_P1" Handbefehl Pumpe P1 0
%I0.6 "Hand_V1" Handbefehl Ventil V1 0
%I1.0 "LSHH_T1" Überfüllsicherung T1 0
%I1.1 "MS_P1_OK" Motorschutz P1 (Öffner) 1
%IW64 "LT101_Roh" Füllstand analog (0 … 27648) 11.609
Ausgänge (PAA) und Merker
AdresseSymbolKommentarWert
%Q0.0 "P1_Schuetz" Schütz Pumpe P1 0
%Q0.1 "V1_Ventil" Magnetventil V1 0
%Q0.2 "Hupe" Hupe 0
%Q0.3 "LM_Stoerung" Leuchtmelder Störung 0
%Q0.4 "LM_Anlage_Ein" Leuchtmelder Anlage EIN 0
%MD10 "Fuellstand" Füllstand skaliert [%] (Real) 41,99

Der Füllstand kommt wie bei einer echten Analogbaugruppe als Rohwert 0 … 27648 an und wird im FB mit NORM_X/SCALE_X auf Prozent skaliert.

Echtzeit für alle Besucher

Jede geöffnete Seite hält eine Blazor-Verbindung zum Server. Ein CircuitHandler zählt sie, Module melden Ereignisse über den Event-Bus – und alle Besucher sehen Änderungen sofort, ganz ohne Polling.

  • Live-Zähler über Blazor-Circuits statt Tracking-Cookies
  • Emoji-Reaktionen werden an alle verbundenen Browser gepusht
  • SPS-Starts und Gästebucheinträge erscheinen als Events aus anderen Modulen
Quelltext auf GitHub
– Besucher sind gerade online Spitze heute: – · Sie eingeschlossen

Schicken Sie allen Besuchern ein Emoji

Das Emoji fliegt bei allen geöffneten Seiten aus dem Live-Zähler oben rechts.

Aktivität in Echtzeit

live
  • Alarm in SPS #1DFF: NOT-HALT betätigt
  • SPS #1DFF wurde in RUN geschaltet
Ein CircuitHandler zählt die Verbindungen, Module melden Ereignisse per IEventBus, und jede Komponente rendert über ihren eigenen SignalR-Circuit neu.

Daten mit Entity Framework Core

Das Gästebuch speichert Einträge mit EF Core im eigenen Schema [guestbook]. Der SQL-Inspector zeigt das tatsächlich erzeugte SQL samt Parametern und Laufzeit. Darunter: die Besucherstatistik, aggregiert im Schema [analytics].

  • DataAnnotations-Validierung, Honeypot und Rate Limiting mit System.Threading.RateLimiting
  • Abfragen per ToQueryString() und DbCommandInterceptor sichtbar gemacht
  • Statistik ohne Cookies: gepuffert, gebündelt geschrieben per ExecuteUpdate
Quelltext auf GitHub

Hinterlassen Sie einen Gruß

Validiert mit DataAnnotations, gespeichert mit EF Core.

Ich bin …
Bitte keine Links – das hält Spam fern. 0 / 500

Einträge

Live aus der Datenbank

SQL-Inspector
EF Core → SQL Server
-- Die Abfrage wird ausgeführt, sobald die Komponente interaktiv ist.

Seitenaufrufe pro Tag

Letzte 14 Tage · live aus Azure SQL (Schema analytics)

Der modulare Monolith von innen

Was Sie hier sehen, ist nicht von Hand gepflegt: Module, Datenbankschemas, Migrationen, Events und Endpunkte werden zur Laufzeit aus der Anwendung ausgelesen.

  • Jedes Modul registriert sich über IModule beim Host
  • Endpunkte tragen Metadaten und lassen sich ihrem Modul zuordnen
  • Abhängigkeiten werden aus den Assembly-Referenzen ermittelt
Quelltext auf GitHub
Aufbau des modularen Monolithen Der Host referenziert vier Module. Module referenzieren sich nicht gegenseitig; das Modul Besucher und Echtzeit kennt nur die Contracts von Gästebuch und SPS-Simulator. Alle Module bauen auf den Bausteinen BuildingBlocks und UI auf. KenoKoch.Web · Host Komposition · Seiten · Layout · OpenAPI · Health · Security Web.Client WebAssembly Profil Lebenslauf & Skills /api/profile Gästebuch EF Core · Validierung schema [guestbook] Besucher & Echtzeit SignalR · Statistik schema [analytics] SPS-Simulator Soft-SPS · HMI OB1 · 100 ms Guestbook.Contracts GuestbookEntrySubmitted Plc.Contracts PlcStarted · PlcAlarmRaised nur über Contracts BuildingBlocks IModule · Event-Bus · Persistenz · Health Checks UI Icons · Code-Blöcke · Formatierung (Server + WASM) von allen Modulen genutzt

Profil

KenoKoch.Modules.Profile · v1.0.0

Lebenslauf, Skills und Kontaktdaten – als Datenquelle für die Seite und als JSON-API.

Endpunkte
GET/api/profileGET/api/profile/skills
Veröffentlicht
–
Abonniert
–
Migrationen
–
Abhängigkeiten
BuildingBlocksUI
UI-Komponenten
2 Razor-Komponenten

Gästebuch

KenoKoch.Modules.Guestbook · v1.0.0
[guestbook]

Einträge von Besuchern: Validierung, Spam-Schutz und Persistenz mit EF Core im eigenen Schema.

Endpunkte
GET/api/guestbook
Veröffentlicht
GuestbookEntrySubmitted
Abonniert
–
Migrationen
InitialCreate (24.10.2026)
Abhängigkeiten
BuildingBlocksModules.Guestbook.ContractsUI
UI-Komponenten
2 Razor-Komponenten

Besucher & Echtzeit

KenoKoch.Modules.Analytics · v1.0.0
[analytics]

Live-Besucherzähler über Blazor-Circuits, datensparsame Tagesstatistik ohne Cookies und ein Echtzeit-Aktivitätsfeed.

Endpunkte
GET/api/stats
Veröffentlicht
–
Abonniert
GuestbookEntrySubmitted, PlcStarted, PlcAlarmRaised
Migrationen
InitialCreate (24.10.2026)
Abhängigkeiten
BuildingBlocksModules.Guestbook.ContractsModules.Plc.ContractsUI
UI-Komponenten
5 Razor-Komponenten

SPS-Simulator

KenoKoch.Modules.Plc · v1.0.0

Soft-SPS mit zyklischem Scan (100 ms), Funktionsbaustein nach SCL-Vorbild in C# und HMI mit Meldesystem.

Endpunkte
GET/api/plc/programGET/api/plc/status
Veröffentlicht
PlcStarted, PlcAlarmRaised
Abonniert
–
Migrationen
–
Abhängigkeiten
BuildingBlocksModules.Plc.ContractsUI
UI-Komponenten
4 Razor-Komponenten

Architekturregeln – per Test im CI erzwungen

  • Module referenzieren keine anderen Module, nur deren *.Contracts.
  • Contracts enthalten nur Events und hängen ausschließlich von BuildingBlocks ab.
  • Jedes Modul mit Daten besitzt ein eigenes Schema und eine eigene Migrationshistorie.
  • BuildingBlocks und UI kennen kein einziges Modul.

C# rechnet in Ihrem Browser

Die Mandelbrot-Menge wird von .NET in WebAssembly berechnet – Pixel für Pixel in C#, gezeichnet über JavaScript-Interop auf ein Canvas. Der Server ist daran nicht beteiligt: Schauen Sie gern in den Netzwerk-Tab.

  • Rechenintensive Logik läuft komplett clientseitig
  • Streifenweises Rendern hält die Oberfläche flüssig
  • byte[]-Puffer werden effizient an das Canvas übergeben
Quelltext auf GitHub

Eine API für alles, was Sie hier sehen

Jedes Modul bringt eigene Minimal-API-Endpunkte mit. Die OpenAPI-Beschreibung entsteht automatisch, die Abfragen unten schickt eine WebAssembly-Komponente per HttpClient direkt aus Ihrem Browser.

  • OpenAPI 3.1 aus Microsoft.AspNetCore.OpenApi, interaktive Referenz mit Scalar
  • Typisierte Ergebnisse mit TypedResults und ProblemDetails
  • Rate Limiting pro IP-Adresse für alle /api-Endpunkte
Quelltext auf GitHub

Unter der Haube – live vom Server

Diese Werte liest der Server gerade über sich selbst aus: Azure-Region und Instanz, .NET-Version, Speicher, Garbage Collector und die Latenz zur Azure-SQL-Datenbank, mit der er sich passwortlos per Managed Identity verbindet.

  • App-Service-Umgebungsvariablen statt hart kodierter Werte
  • Datenbank-Probe mit SERVERPROPERTY und DATABASEPROPERTYEX
  • Telemetrie über OpenTelemetry nach Application Insights
Quelltext auf GitHub
Verbindung wird aufgebaut …
Alle 2 Sekunden neu vom Server, auf dem diese Seite gerade läuft.

Hosting

Plattform
Azure App Service
Region
germanywestcentral
Instanz
547967cb
Tarif
Basic
Umgebung
–

Laufzeit

.NET
–
Betriebssystem
–
Architektur
–
Prozess läuft seit
–
Thread-Pool
–

Ressourcen

Arbeitsspeicher
–
Managed Heap
–
GC-Läufe (Gen 0/1/2)
–

Datenbank

Wird geladen …

Build & Betrieb

Version
1.0.0
Commit
a7e0f7b
Gebaut
25.10.2026, 10:37 Uhr
Telemetrie
Application Insights (OpenTelemetry)
Da ist etwas schiefgelaufen. Seite neu laden

Verbindung zum Server wird wiederhergestellt …

Noch keine Verbindung – neuer Versuch in Sekunden.

Die Verbindung konnte nicht wiederhergestellt werden.
Bitte erneut versuchen oder die Seite neu laden.

Die Sitzung wurde vom Server pausiert.

Die Sitzung konnte nicht fortgesetzt werden.
Bitte erneut versuchen oder die Seite neu laden.