【问题标题】:ASP.Net Core MVC UseExceptionHandler results in blank pageASP.Net Core MVC UseExceptionHandler 导致空白页
【发布时间】:2018-03-06 15:51:34
【问题描述】:

构建 ASP.Net Core (V2) MVC 站点。

我们为此使用 API 版本。

该站点具有提供 MVC Razor 视图以及 API 样式 Json 响应的控制器。

我正在尝试使用 UseExceptionHandler() 方法,如下所示。

当我在其中一个操作中遇到异常时,该操作会再次执行,然后显示一个空白页面。浏览器控制台也没有任何错误。最后,我的错误操作永远不会被命中。

我为 API 控制器设置了一个自定义异常过滤器,如下所示。我已经对此发表了评论,认为这是干扰。这没有解决任何问题。

我哪里错了?以及如何在出现异常时点击我的自定义错误页面。

异常处理方法 - 这会导致“/v1.0/home/error”

app.UseExceptionHandler($"/v{appSettings.Value.APIVersion}/home/error");

我也试过了,在读到这应该是视图的路径

app.UseExceptionHandler("/error");

app.UseExceptionHandler("/views/home/error");

错误操作

 [HttpGet("error")]
 public IActionResult Error()
 {
      var exception = HttpContext.Features.Get<IExceptionHandlerFeature>();
      ViewData["statusCode"] = HttpContext.Response.StatusCode;
      ViewData["message"] = exception.Error.Message;
      return View();
 }

异常过滤器(目前在 startup.cs 中被注释掉了)

public override void OnException(ExceptionContext context)
 {
       if (context.HttpContext.Request.Path.Value.Contains("/api"))
       {
             // Set the response
             context.ModelState.GroupErrorsIntoKey("ErrorArray");
             context.ModelState.AddModelError("ErrorArray", context.Exception.Message);
             context.Result = new BadRequestObjectResult(context.ModelState);
         }
 }

【问题讨论】:

  • 似乎是路由问题。尝试直接访问您输入UseExceptionHandler() 的URL。 Error() 动作是否命中?
  • 当我进入浏览器时,我可以很好地到达路线。此后我将其更改为使用 UseStatusCodePagesWithReExecute() - 这适用于 404,但在异常时会出现空白页;太令人沮丧了!
  • 我无法重现您的问题。可能您在启动配置方面存在一些问题。是否可以将问题重现的测试项目放在github上?
  • @CodeFuller 感谢您的关注。我将删除这个问题并用不同的细节重新提问。我发现结果非常不一致。我已经实现了一个自定义异常处理程序。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

我有一个类似的混合 Razor/API 设计并遇到了同样的问题。显然,这是由于 2.0 中操作解决过程的变化而发生的。这个问题“Problems using UseExceptionHandler()”非常详细地描述了它并提供了解决方法。

引用 Microsoft/aspnet-api-versioning developer 提供的解释(来自上面的链接):

“此问题是由于 2.0 中操作解决过程的更改而发生的,该更改修复了在 1.0 中影响部分但不是全部的错误。ASP.NET Core 设计预计管道会在第一个动作匹配。如果没有动作,则采取错误路径,通常是 404。这与平台可能多次调用动作选择器的事实相结合。这种行为的后果是 API 版本控制无法使它的决定,直到所有可能的路线都被考虑在内。知道这一点的唯一方法是在最后执行一条捕获所有路线。不幸的是,这会导致路线的其他一些末端行为如您所见那样表现出意外。正如您所见可以想象,在每个请求上重新评估整个路由树是非常低效的。为了优化事情,API 版本控制跟踪版本控制策略是否已经为给定路由至少评估过一次。一旦有,它可以使更早的最终决定在管线中。这就是导致您首先看到事情没有按照您的预期进行的行为,然后随后的调用就可以了。”

解决方法是稍微不同地配置 UseExceptionHandler()。这对我有用:

app.UseExceptionHandler(new ExceptionHandlerOptions
{
  ExceptionHandler = async context =>
  {
     var exception = context.Features.Get<IExceptionHandlerFeature>().Error;

     if (!context.Request.Path.StartsWithSegments(new PathString("/api"), StringComparison.OrdinalIgnoreCase))
     {
        context.Response.Redirect("Error");
     }
     else
     {
        context.Response.ContentType = "application/json";
        var response = new
        {
            Error = exception.Message
        };
        await context.Response.WriteAsync(JsonConvert.SerializeObject(response));
     }
   }
});

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
相关资源
最近更新 更多