@page "/logout" @inject IAuthenticationClientService AuthenticationClientService @inject NavigationManager NavigationManager HELLO WORLD @code { protected override async Task OnAfterRenderAsync(bool firstRender) { // 作用:这个方法在组件渲染到 UI 后被调用。 // 意义:这是执行 JS 互操作的安全时机,特别是在启用了预渲染的情况下, // 此时客户端的 JS 运行时已经可用(在 Blazor Server 中通过 SignalR,在 Blazor WASM 中是 WASM 环境本身)。 // firstRender 参数: // 作用:指示本次调用是否是组件首次在客户端渲染完成。 // 意义:注销逻辑只需要执行一次。使用 firstRender = true 可以避免在组件后续状态变化触发重新渲染时重复执行。 if (firstRender) { Console.WriteLine("Signout: OnAfterRenderAsync - First Render. Executing Logout..."); // 可选日志 try { // === 在这里安全地调用依赖 JS Interop 的注销方法 === // AuthenticationClientService.Logout() 方法内部会调用 _localStorageService.RemoveItemAsync(), // 现在是调用它的安全时机。 // 注销完成后,执行导航重定向 NavigationManager.NavigateTo("/"); } catch (Exception ex) { // === 处理 Logout 中可能发生的异常 === // 例如,如果 Local Storage 操作失败,或者 Logout 方法内部有其他错误 Console.WriteLine($"Error during logout in Signout component: {ex.Message}"); // 你可能需要在这里显示错误信息给用户,或者决定是否依然重定向 // 即使注销失败,通常也希望将用户导航到某个页面(如首页或错误页) // 例如: NavigationManager.NavigateTo("/"); // 即使失败也重定向到首页 // 或者 NavigationManager.NavigateTo("/error"); // 重定向到错误页 } Console.WriteLine("Signout: OnAfterRenderAsync - First Render. Logout execution finished."); // 可选日志 } } }