.net 如何在Blazor.Server C#中全局处理/捕获异常

db2dz4w8  于 2023-02-26  发布在  .NET
关注(0)|答案(2)|浏览(756)

我试图找到解决方案,如何捕捉和保存异常在我的Blazor WASM核心托管应用程序中更全局的方式,除了把尝试捕捉代码在我的所有方法在我的控制器。
在我的应用程序Blazor WebAssembly的UI部分,我使用ErrorBoundary捕获错误,这对WebAssembly来说相当不错,但对于来自Blazor.Server的异常,我只得到“500(内部服务器错误)”和在.razor组件中触发此错误的方法的确切位置。
我想实现类似的东西,但这将工作在我的控制器在Blazor服务器。确切的控制器和后端的代码行导致这个错误。

<ErrorBoundary>
    <ChildContent>
        @Body
    </ChildContent>
    <ErrorContent Context="Exception">
        @SaveLogs(Exception)
    </ErrorContent>
</ErrorBoundary>
ws51t4hk

ws51t4hk1#

在您的 API Controllers 项目中,您可以使用Middleware全局捕获异常。This video帮助我了解了很多。

app.UseMiddleware<ExceptionHandlingMiddleware>();

异常处理中间件.cs

public class ExceptionHandlingMiddleware : IMiddleware
{
    private readonly ILogger _logger;
    public ExceptionHandlingMiddleware(ILogger<ExceptionHandlingMiddleware> logger)
    {
        _logger = logger;
    }
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        // Caller will either receive 200 (OK) or one of the below;
        try
        {
            await next(context);
            // Catch, handle and log known exceptions below.
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; // 500
            // When catching general exceptions, we don't want to write them to the response.
            await context.Response.WriteAsync("Internal Server Error. Please Try Again Later.");
            _logger.Log(LogLevel.Error, $"Message: {Environment.NewLine + ex.Message} {Environment.NewLine}Trace: {Environment.NewLine + ex.StackTrace ?? String.Empty}");
        }

    }
}

我很想在 Blazor Server Side 项目中将<ErrorBoundary>替换为Middleware,但似乎还不可能。

xpcnnkqh

xpcnnkqh2#

有一种非常优雅的方法可以做到这一点,你想检查这个Library,Oyu可以从方法返回结果,结果是一个结构体,保存你的数据,你的异常发生在以前的方法等。
此外,Youtube上的nick chapsas先生有一个关于这个主题的完整视频。

相关问题