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
。
我正在尝试在 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
。