剃刀自定义错误页面忽略了它的OnGet处理程序

时间:2019-09-16 09:54:03

标签: c# asp.net-core razor-pages

有自定义错误页面:

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

这看起来像身份验证问题。用户通过身份验证后,一切都会按预期进行。但是对于未经身份验证的用户,不会调用我的OnGetErrorModel没有Authorize属性。身份验证如何影响这一点?

我没有任何自定义身份验证配置,因此,我假设使用默认值:

    private void ConfigureMvcServices(IServiceCollection services)
    {
        services
            .AddMvc()
            // another services;
    }

错误页面位于Pages文件夹-Pages/Error中。

此外,如果用户未通过身份验证,并且页面需要身份验证,则必须返回401,不是吗?

2 个答案:

答案 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>