Blazor 服务器:中间件中的 NavigationManager

Blazor Server: NavigationManager in Middleware

我正在尝试在 Blazor Server 应用程序中创建一个 httphandler 来处理所有不成功的状态代码。如果抛出 401,我想重定向到自定义 401 页面。

出于某种原因,我无法在依赖注入后让 NavigationManager 工作。它看起来确实加载了 NavigationManager,但它从未对其进行初始化。

public class RichardsHandler : DelegatingHandler
{
    protected readonly NavigationManager _navManager;
    public RichardsHandler(NavigationManager navigationManager)
    {
        _navManager = navigationManager;
    }
    protected override async Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);

        _navManager.NavigateTo("/401");

        return response;
    }
}

我只是将 NavigateTo 放在那里尝试导航到另一个页面,但我总是收到“InvalidOperationException:'RemoteNavigationManager' 尚未初始化”异常。

同样,这是一个 Blazor 服务器端应用程序。我是不是忽略了什么,或者这是 NavigationManager 设计的?

中间件只会在应用程序初始加载时调用。之后一切都由构成导航管理器管道的各种代码和路由器组件处理in-page:没有回调到服务器,因此没有调用中间件。

NavigationManager 是一种 DI 服务,只要发生浏览器端导航事件,它就会从浏览器中的 Blazor 客户端代码 运行 接收数据。您不能直接从中间件访问它,因为它只存在于服务器上的 Blazor Hub 会话中。

如果您想在未找到和未经授权的请求页面上显示特定组件或标记,请将其编码为 App.razor