9

I am making a chatroom App by the blazor server-side.

I want to show the online state of each user.

Now I can use the OnAfterRenderAsync event to get a user has entered the page.

It seems there is not any exit event in blazor lifecycle via https://learn.microsoft.com/en-us/aspnet/core/blazor/lifecycle?view=aspnetcore-3.1

Someone said I can use the Dispose event to achieve it while it does work at all.

What's more, I have a crazy idea that using the window.onbeforeunload event of js to invoke the blazor method.

I have no idea which one is best. Would you please give me a suggestion? Thank you.

Melon NG
  • 2,568
  • 6
  • 27
  • 52
  • "I am making a chatroom App by the blazor server-side" - I would use SignalR instead. – Vojtěch Dohnal Jan 30 '20 at 07:46
  • @VojtěchDohnal Yes, now I am using a SignalR also. I use blazor for I want make a single-page application with C#. – Melon NG Jan 30 '20 at 07:48
  • Isn't entering and leaving the chatroom handled by SignalR then? – Vojtěch Dohnal Jan 30 '20 at 07:49
  • 1
    @VojtěchDohnal I tried this. After I closed the page, it doesn't work at all. It seems the connection.Closed event only works while the page is alive. – Melon NG Jan 30 '20 at 07:55
  • It does not handle only the situation when the browser window is closed without logoff otherwise it works well I guess. You mean the SignalR hub `OnDisconnectedAsync` handler does not work for you? – Vojtěch Dohnal Jan 30 '20 at 09:09
  • @VojtěchDohnal No,I am using this event:https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.signalr.client.hubconnection.closed?view=aspnetcore-2.2 – Melon NG Jan 30 '20 at 09:13

1 Answers1

11

You should implement a CircuitHandler on the server for this.

You can find the documentation here https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.server.circuits.circuithandler?view=aspnetcore-3.1

It enables you to react to lifecycle events for the Circuit, which is the backbone of a Blazor Server connection.

Methods

OnCircuitClosedAsync(Circuit, CancellationToken)
Invoked when a new circuit is being discarded.

OnCircuitOpenedAsync(Circuit, CancellationToken)
Invoked when a new circuit was established.

OnConnectionDownAsync(Circuit, CancellationToken)
Invoked when a connection to the client was dropped.

OnConnectionUpAsync(Circuit, CancellationToken) Invoked when a connection to the client was established. - This method is executed once initially after OnCircuitOpenedAsync(Circuit, CancellationToken) and once each for each reconnect during the lifetime of a circuit.

Mister Magoo
  • 7,452
  • 1
  • 20
  • 35
  • 5
    I found a sample project here also:https://github.com/nagytam/BlazorCircuitHandler. I tried the sample project and it is just what I need. – Melon NG Jan 30 '20 at 09:17