Entwicklung

Blazor Ressourcen in privaten Browserfenstern

Wie Blazor statische Ressourcen im normalen und auch privaten Browsermodus korrekt lädt

Admin 09.03.25
EntwicklungBlazor
Blazor Ressourcen in privaten Browserfenstern

Wie Blazor Statische Ressourcen im privaten Browsermodus korrekt lädt

Das Problem: Inkonsistente CSS-Darstellung im privaten Modus

Bei der Entwicklung dieser meiner Bloganwendung trat ein Problem mit der CSS-Darstellung im privaten Browsermodus auf. Während die Anwendung im normalen Browsermodus tadellos funktionierte, zeigten sich im privaten Modus Styling-Inkonsistenzen. Besonders auffällig war dies bei der Zentrierung von Text-Elementen im HeroCarousel - ein zentrales Feature der Startseite.

Die Ursache: Cache-Verhalten im privaten Modus

Das Problem lag in der speziellen Art und Weise, wie Blazor mit statischen Ressourcen umgeht, kombiniert mit dem besonderen Cache-Verhalten von Browsern im privaten Modus. Dies betraf verschiedene CSS-Datei-Typen:

  • normale .css Dateien (wie main.css, app.css)
  • Blazor-spezifische .styles.css Dateien (die für Component-Styles verwendet werden)
  • gebündelte .bundle.scp.css Dateien (die von Blazor für Scoped Styles generiert werden)

Meine Lösung: Optimierte Cache-Header

Die aktuelle Implementierung nutzt eine ausgewogenere Strategie für das Caching von CSS-Dateien, die sowohl im normalen als auch im privaten Modus funktioniert:

app.UseStaticFiles(new StaticFileOptions
{
    ServeUnknownFileTypes = false,
    OnPrepareResponse = ctx =>
    {
        var headers = ctx.Context.Response.Headers;
        
        if (ctx.File.Name.EndsWith(".css", StringComparison.OrdinalIgnoreCase) || 
            ctx.File.Name.EndsWith(".styles.css", StringComparison.OrdinalIgnoreCase) ||
            ctx.File.Name.EndsWith(".bundle.scp.css", StringComparison.OrdinalIgnoreCase))
        {
            // Cache-Header direkt setzen
            headers["Cache-Control"] = "private, max-age=86400";
            
            // ETag für Validierung
            if (ctx.File.Exists)
            {
                var hash = Convert.ToBase64String(System.Security.Cryptography.SHA256.HashData(
                    System.Text.Encoding.UTF8.GetBytes(ctx.File.LastModified.ToString())));
                headers["ETag"] = $"\"{hash}\"";
            }
            
            // Last-Modified für Validierung
            headers["Last-Modified"] = ctx.File.LastModified.ToString("R");
        }
    }
});
    

Diese Lösung:

  1. Erkennt alle CSS-Dateiarten durch Prüfung der Dateiendungen
  2. Setzt einen moderaten Cache-Zeitraum von 24 Stunden
  3. Implementiert ETag-basierte Validierung
  4. Nutzt Last-Modified für zusätzliche Validierungsmöglichkeiten

Cache-Header im Detail

  • Cache-Control: private, max-age=86400
  • private: Nur der Browser darf die Ressource cachen
  • max-age=86400: Cache ist für 24 Stunden gültig
  • ETag: Ein Hash-basierter Identifier für die Ressource
  • Ermöglicht effiziente Validierung durch den Browser
  • Basiert auf dem Last-Modified-Zeitstempel der Datei
  • Last-Modified: Zeitstempel der letzten Änderung
  • Zusätzlicher Mechanismus für die Cache-Validierung
  • Format entspricht dem RFC Standard

Performance und Browser-Verhalten

Die aktuelle Implementierung bietet mehrere Vorteile:

  1. Verbessertes Caching:
  • CSS-Dateien werden für 24 Stunden gecacht
  • Reduzierte Server-Anfragen
  • Schnelleres Laden wiederkehrender Besucher
  1. Robuste Validierung:
  • ETag-basierte Validierung ermöglicht effiziente Updates
  • Last-Modified als Fallback-Mechanismus
  • Automatische Aktualisierung bei Änderungen
  1. Konsistentes Verhalten:
  • Funktioniert zuverlässig im normalen und privaten Modus
  • Keine speziellen Anpassungen für verschiedene Modi nötig
  • Bessere Wartbarkeit durch einheitlichen Ansatz

Blazor-spezifische Aspekte

  • Behandelt alle CSS-Varianten einheitlich
  • Unterstützt das dynamische Laden von Komponenten-Styles
  • Funktioniert mit gebündelten und Scoped Styles

Fazit

Die aktuelle Implementierung bietet eine ausgewogene Lösung für das CSS-Caching:

  • Effizientes Caching für 24 Stunden
  • Robuste Validierungsmechanismen
  • Konsistentes Verhalten in allen Browser-Modi
  • Verbesserte Performance durch reduzierte Server-Anfragen

Praxistipp

Auch wenn die Lösung in beiden Browser-Modi zuverlässig funktioniert, empfiehlt sich weiterhin regelmäßiges Testen in verschiedenen Browser-Modi. Dies hilft, potenzielle Styling-Probleme frühzeitig zu erkennen und die Konsistenz der Darstellung sicherzustellen.

Mehr zum Thema

Wie man YouTube-Videos in eine Website einbindet

YouTube-Videos auf der eigenen Website einzubinden, kann den Inhalt aufwerten und die Nutzerbindung erhöhen. In diesem Artikel zeige ich dir verschiedene Ansätze – von der klassischen iFrame-Einbettung über die Nutzung der YouTube IFrame API bis hin zu Lösungen für WordPress und eine datenschutzfreundliche Variante.

Admin 19.03.25
Anmeldung zum Newsletter
Erhalte Infos zu neuen Inhalten und Aktionen in unregelmäßiger Folge direkt in deinen Posteingang. Es ist kostenlos und du kannst dich jederzeit abmelden. Keine Sorge, ich hasse Spam genauso wie du: also spamme ich nicht!
An unhandled error has occurred. Reload 🗙