gpt4 book ai didi

c# - UseExceptionHandler Blazor 服务器端

转载 作者:行者123 更新时间:2023-12-05 01:38:11 25 4
gpt4 key购买 nike

有人可以确认 app.UseExceptionHandler() 不适用于服务器端 blazor 吗?

我见过几个案例,我的自定义 ErrorHandler 没有捕获我的应用程序抛出的异常。示例代码

Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
{
...
app.UseExceptionHandler(new ExceptionHandlerOptions { ExceptionHandler = ErrorHandler.HandleError });
...
}

ErrorHandler.cs:

public static async Task HandleError(HttpContext context)
{
var error = context.Features.Get<IExceptionHandlerFeature>()?.Error;
var message = error?.Message ?? "[EXCEPTION NOT FOUND]";
return;
}

例如,当我的存储库抛出这样的异常时:无法跟踪实体类型的实例,因为已跟踪具有相同键值 {'Id'} 的另一个实例

我的 MVC 解决方案捕获所有异常,并且使用类似的 ErrorHandling 实现。

最佳答案

事实上,许多 ASP Core 中间件方案无法在服务器端 Blazor 应用程序中完全运行。这是因为 Blazor 与 SignalR 和 Blazor Hub 配合使用。

您会看到,在启动 Blazor 应用程序时,首先会有一些 HTTP 请求通过管道直到结束。 (在大多数情况下,这些是初始页面加载,然后是协商阶段)。但是随后出现了对“/_blazor”的请求,此时连接保持打开状态以继续通过 websockets 进行通信。如果在此阶段之后出现异常,它将不会进入您的异常处理程序。

您可以通过创建一个小型中间件类来观察这一点,该中间件类通过 IApplicationBuilder 上的 UseMiddleware 扩展方法注册。这样的中间件类需要一个 Invoke 方法,例如:

.....
public class TestMiddleware
{
private readonly RequestDelegate _next;
public TestMiddleware(RequestDelegate next)
{
_next = next
}

public async Task Invoke(HttpContext context)
{
await _next(context);
}
....

如果您在 Invoke 中放置一个断点,您会注意到一旦上下文参数用于路径“/_blazor”,您将不会再进一步​​。

这是另一个讨论类似问题的链接,它不同于异常处理程序,但也与 ASP.NET 中间件相关: https://github.com/aspnet/SignalR/issues/1334

关于c# - UseExceptionHandler Blazor 服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59983578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com