有自定义错误页面:
public sealed class ErrorModel : PageModel
{
public ErrorModel()
{
// app stops at breakpoint inside ctor
}
public IActionResult OnGet()
{
// app doesn't stop here, why?
// this is for debugging purposes only
return BadRequest();
}
}
及其视图:
@page
@model ErrorModel
@if (Model != null)
{
<p>
The error page.
</p>
}
页面以常规方式注册:
app.UseExceptionHandler("/Error");
当应用程序重定向到错误页面时,它在页面构造函数和页面视图内的断点处停止,但忽略OnGet
内部的代码。由于应用程序不会调用我的OnGet
,因此页面渲染没有我在OnGet
内填写的任何有用数据。
所有断点均已启用-我正在调试实际代码。
知道发生了什么以及如何解决这个问题?
UPD
我减少了页面模型代码和视图。 当应用程序在此行停止时:
@if (Model != null)
调用堆栈为:
Portal.App.Views.dll!Portal.Pages.Pages_Error.ExecuteAsync()第4行C# Microsoft.AspNetCore.Mvc.RazorPages.dll!Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.RazorPageAdapter.ExecuteAsync()未知 Microsoft.AspNetCore.Mvc.Razor.dll!Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(Microsoft.AspNetCore.Mvc.Razor.IRazorPage页,Microsoft.AspNetCore.Mvc.Rendering.ViewContext上下文)未知 Microsoft.AspNetCore.Mvc.Razor.dll!Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(Microsoft.AspNetCore.Mvc.Razor.IRazorPage页面,Microsoft.AspNetCore.Mvc.Rendering.ViewContext上下文,bool invokeViewStarts)未知 Microsoft.AspNetCore.Mvc.Razor.dll!Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(Microsoft.AspNetCore.Mvc.Rendering.ViewContext上下文)未知 Microsoft.AspNetCore.Mvc.ViewFeatures.dll!Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext,字符串contentType,int?statusCode)未知 Microsoft.AspNetCore.Mvc.RazorPages.dll!Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageResultExecutor.ExecuteAsync(Microsoft.AspNetCore.Mvc.RazorPages.PageContext pageContext,Microsoft.AspNetCore.Mvc.RazorPages.PageResult结果)未知 Microsoft.AspNetCore.Mvc.RazorPages.dll!Microsoft.AspNetCore.Mvc.RazorPages.PageResult.ExecuteResultAsync(Microsoft.AspNetCore.Mvc.ActionContext context)未知
因此,应用程序执行PageResult
。这个结果来自哪里?
UPD 2
这看起来像身份验证问题。用户通过身份验证后,一切都会按预期进行。但是对于未经身份验证的用户,不会调用我的OnGet
。 ErrorModel
没有Authorize
属性。身份验证如何影响这一点?
我没有任何自定义身份验证配置,因此,我假设使用默认值:
private void ConfigureMvcServices(IServiceCollection services)
{
services
.AddMvc()
// another services;
}
错误页面位于Pages
文件夹-Pages/Error
中。
此外,如果用户未通过身份验证,并且页面需要身份验证,则必须返回401,不是吗?
答案 0 :(得分:1)
我知道了。陷阱是here:
为生产配置自定义错误处理页面 环境,请使用异常处理中间件。中间件:
- 捕获并记录异常。
- 在备用管道中针对指定的页面或控制器重新执行请求。如果响应不重新执行该请求 已经开始。
“重新执行”的字面意思是,如果在GET处理程序中引发了异常,则中间件将调用错误页面的OnGet。如果是在POST处理程序中引发的,则中间件将调用OnPost等:
public class ErrorModel : PageModel
{
public ErrorModel()
{
}
public void OnGet()
{
// This executes when exception was in OnGet
}
public void OnPost()
{
// This executes when exception was in OnPost
}
// ...
}
就我而言,在具有身份验证的页面上有一个GET请求,而在未经身份验证的页面上有一个POST请求,所以这是行为上的区别。
答案 1 :(得分:0)
您是否已在网络配置中启用自定义错误。像这样:
<httpErrors errorMode="Custom" existingResponse="Replace">
<clear />
<error statusCode="500" path="/Error" responseMode="ExecuteURL" />
</httpErrors>