在我的.Net Blazor服务器应用程序中,我希望在出现未处理的异常时向用户显示一个错误页面。但我似乎无法显示此错误页面。为了让它显示出来,我添加了一个按钮,它只是抛出一个Exception
(我也尝试过强制执行DivideByZeroException
(,但UseExceptionHandler
并没有选择它,我只是在调试输出中得到了一个未处理的异常(在不调试的情况下运行它只会冻结页面(。我的中间件配置层次结构似乎得到了验证。如果我只输入urllocalhost:[port]/Error
,我就会进入错误页面。
我错过了什么?
启动.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>
错误.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;
}
}
}
解决方案是用Blazor组件(.rarzor(替换Error.cshtml和Error.cshhtml.cs,并将以下组件结构添加到MainLayout.cs文件中:
<ErrorBoundary>
<ChildContent>
@Body
</ChildContent>
<ErrorContent Context="Exception">
<Presentation.WebUI.Pages.Error></Presentation.WebUI.Pages.Error>
</ErrorContent>
</ErrorBoundary>