UseExceptionHandler 未将未经处理的异常路由到“错误”页

UseExceptionHandler not routing unhandled exceptions to Error page

提问人:KDA 提问时间:10/17/2022 更新时间:10/20/2022 访问量:185

问:

在我的 .Net Blazor 服务器应用程序中,我希望在出现未经处理的异常时向用户显示“错误”页。但我似乎无法显示此错误页面。为了尝试显示它,我添加了一个按钮,该按钮只是抛出一个(我也尝试过强制一个),但我没有选择它,我只是在我的调试输出中得到一个未经处理的异常(在没有调试的情况下运行它只会冻结页面)。我的中间件配置层次结构似乎检查出来了。如果我只是输入 url,我会进入错误页面。ExceptionDivideByZeroExceptionUseExceptionHandlerlocalhost:[port]/Error

我错过了什么?

Startup.cs

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseExceptionHandler("/Error");           
    app.UseHsts();
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}

错误.cshtml

@page 
@model Presentation.WebUI.Pages.ErrorModel

<!DOCTYPE html>
<html>
[...html...]
</html>

Error.cshtml.cs

using [...]

namespace Presentation.WebUI.Pages
{
    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    [IgnoreAntiforgeryToken]
    public class ErrorModel : PageModel
    {
        public string RequestId { get; set; }

        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);

        private readonly ILogger<ErrorModel> _logger;

        public ErrorModel(ILogger<ErrorModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
            RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
        }
    }
}
asp.net .NET 异常 blazor custom-error-pages

评论


答:

0赞 KDA 10/20/2022 #1

解决方案是将 Error.cshtml 和 Error.cshtml.cs 替换为 Blazor 组件 (.razor),并将以下组件结构添加到 MainLayout.cs 文件:

<ErrorBoundary>
   <ChildContent>                      
      @Body                                
   </ChildContent>
   <ErrorContent Context="Exception">
      <Presentation.WebUI.Pages.Error></Presentation.WebUI.Pages.Error>
   </ErrorContent>
</ErrorBoundary>