Blazor Server Side应用程序使用SignalR与服务器进行通信,因此可以使用SignalR的相关事件来实现用户在关闭选项卡或浏览器时自动注销。
services.AddSignalR();
@inject NavigationManager NavigationManager
@inject IJSRuntime JSRuntime
@implements IDisposable
private HubConnection hubConnection;
private string connectionErrorMessage;
protected async override Task OnInitializedAsync()
{
hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/myHub"))
.Build();
hubConnection.On("Logout", (message) =>
{
JSRuntime.InvokeVoidAsync("alert", message);
NavigationManager.NavigateTo("/");
});
try
{
await hubConnection.StartAsync();
}
catch (Exception ex)
{
connectionErrorMessage = ex.Message;
}
}
public async ValueTask DisposeAsync()
{
if (hubConnection != null)
{
await hubConnection.DisposeAsync();
}
}
public class MyHub : Hub
{
public async Task LogoutAsync(string message)
{
await Clients.All.SendAsync("Logout", message);
}
public override async Task OnDisconnectedAsync(Exception exception)
{
await LogoutAsync("用户已注销");
await base.OnDisconnectedAsync(exception);
}
}
@inject NavigationManager NavigationManager
@inject HubConnection hubConnection
@page "/logout"
@if (hubConnection.State == HubConnectionState.Disconnected)
{
@("SignalR连接错误:" + hubConnection.GetConnectionErrorMessage())
}
else
{
正在注销...
}
@code {
protected override async Task OnInitializedAsync()
{
await hubConnection.SendAsync("LogoutAsync", "用户已注销");
NavigationManager.NavigateTo("/", force