Wir machen Schluss mit Blazor

Irgendwann geht alles zu Ende. In der letzten Blazor Schulung kam das Thema auf. Wie zukunftsfähig das alles ist, denn schließlich war da die Sache mit Silverlight.
Beginnen wir von vorne.

Blazor Komponente wird nicht mehr gebraucht

Dafür kann und muss man das Dispose Interface implementieren
@implements IDisposable
Konkret wollte der Kursteilnehmer wissen, ob man noch JavaScript ausführen kann, wenn die Lebenszeit der Komponente endet.

Ja kann man nun

   1:   public void Dispose()
   2:  {
   3:     JSRuntime.InvokeVoidAsync("console.log", "Tut?");
   4:  }

Eigentlich sollte eine Web Service API aufgerufen werden. Dafür nimmt man dann auch das Async Interface

@implements IAsyncDisposable

Falls man auf diese Art und Weise beide Methoden implementiert, wird nur die asynchrone Variante aufgerufen.

   1:  public async ValueTask DisposeAsync()
   2:  {
   3:     await  JSRuntime.InvokeVoidAsync("console.log", "Tut async?");
   4:  }

Das Event wird aufgerufen wenn der Benutzer von der Page weg navigiert oder wenn der Tab geschlossen wird. Allerdings nicht wenn es der letzte Tab oder der ganze Browser ist.

Browser wird nicht mehr gebraucht

Ab hier wird es kompliziert. Die Blazor Server Anwendung läuft am Server. Wenn man ihm den Browser wegzieht, wird es schwierig mit dem ausführen von JavaScript (schwierig=hoffnungslos).

Also haken wir ganz früh im HTML Part ein. In der _hosts.cshtml wird das BevorUnload Event der Browser API angezapft. Das ist allerdings nicht 100% zuverlässig. Es erfordert zumindest eine Benutzerinteraktion in der Website, sonst wird das Event überhaupt nicht ausgelöst.

   1:   <script src="_framework/blazor.server.js"></script>
   2:   <script>
   3:      window.addEventListener('beforeunload', (e) => {
   4:        e.preventDefault()
   5:      return (e.returnValue = '')
   6:    })
   7:  </script>

Wenn es klappt sieht Benutzer folgendes

close1

Ein guter Platz um noch ein letztes JavaScript zu platzieren, bevor der Browser und damit die Blazor Sitzung ihren letzten Atemzug tun.

Aus, Vorbei! Kein Browser mehr

Es gibt diesen Film mit Will Smith “I am Legend”. So fühle ich mich gerade. Der Hauptdarsteller ist der letzte Mensch auf Erden. Alle Tot, nur noch Monster. Also der Browser ist geschlossen und der Webserver steht ganz alleine da, was nun?

Achtung das folgende klappt mit Visual Studio und dem Debugger nicht so richtig. Wenn das Verhalten des Webservers wirklich nachgestellt werden soll, dann muss das Projekt per Deploy in ein Verzeichnis erstellt werden und dort dann die exe gestartet.

Ein Webserver (IIS) hält per SignalR (Abstraktion von Websocket) Verbindung zum Browser. Dieser Blazor Hub kann angezapft werden, per Circuit Interface.

Folglich wird erst einmal eine Klasse angelegt, das Interface implementiert und die Methoden überschrieben

   1:  public class CircuitHandlerService : CircuitHandler
   2:  {
   3:     public override Task OnCircuitClosedAsync(Circuit circuit, CancellationToken cancellationToken)
   4:     {
   5:       Console.WriteLine($"Close {circuit.Id}");
   6:       return base.OnCircuitClosedAsync(circuit, cancellationToken);
   7:     }
   8:  public override Task OnCircuitOpenedAsync(Circuit circuit, CancellationToken cancellationToken)
   9:     {
  10:      Console.WriteLine($"Open {circuit.Id}");
  11:      return base.OnCircuitOpenedAsync(circuit, cancellationToken);
  12:     }

Dann muss man ASP.NET Core ein wenig überlisten und in der program.cs den Circuit Handler bei der Service Collection anmelden mit seiner eigenen Implementierung.

builder.Services.AddSingleton<CircuitHandler>(new CircuitHandlerService());

Nun rufen wir die Exe auf (im zb ….\BlazorTrainungJuli229055\bin\Release\net7.0\publish) und klicken auf den Localhost Link. Der Browser öffnet sich, Zweiter Tab mit identer Url öffnen und dann beide Tabs schließen, bzw den Browser.

close2

So nun ist es vorbei mit Blazor. Aus die Maus.

Kommentare sind geschlossen