【问题标题】:Handling 404 in MVC Core API Project在 MVC Core API 项目中处理 404
【发布时间】:2019-08-07 15:54:27
【问题描述】:

我正试图找出我哪里出错了。我想捕捉到我的 api 的 404 错误。我有中间件设置,但是当我尝试点击不存在的页面时,该异常永远不会发生。

public async Task Invoke(HttpContext context)
{
    try
    {
        await _requestDelegate.Invoke(context);
    }
    catch (Exception exception)
    {
        await HandleExceptionAsync(context, exception);
    }
}


//in startup
app.UseMiddleware<ExceptionHandler>();

我在启动时注册它,这是我做的第一件事以确保它处理其余部分。

【问题讨论】:

  • 404 也不例外。您收到响应,但状态码是 404。您必须通过检查状态码来处理错误。
  • @jdweng 我会在哪里做呢?你有我可以看的代码示例吗?
  • 您需要检查上下文状态属性以抛出异常。代码可以是您可以访问响应的任何地方。
  • @jdweng 你是说我必须编写一个中间件来检查响应是否为 404?然后返回自定义响应?只是感觉不对……
  • 您是否阅读了与此相关的信息?您不必编写自己的中间件处理程序来构建它......您只需要设置它以便它响应,然后您想要捕获您必须通过请求获得较低级别的细节。 docs.microsoft.com/en-us/aspnet/core/fundamentals/… 引用 this 以及与 MVC 相关的项目

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


【解决方案1】:

听起来您希望UseStatusCodePagesWithReExecute 捕获 404 并修改响应、日志等。

//Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseStatusCodePagesWithReExecute("/error/", "?statusCode={0}");
    ...
}

//SomeController.cs
public IActionResult Error(int? statusCode = null)
{
    if(statusCode == 404) return new ObjectResult(new { message = "404 - Not Found" });
    ...
}

【讨论】:

  • 您的示例对我不起作用,但是,以下示例对我有用:app.UseStatusCodePages(async context =&gt; { context.HttpContext.Response.ContentType = "application/json"; await context.HttpContext.Response.WriteAsync("{\"result:\" \"Not Found\"}"); }); 虽然这会将每种类型都返回为 404,但我认为这是可以的,因为它是一个 api,而且只有很少的状态我愿意展示的代码。我现在可以将其更改为针对这些状态代码。
  • 什么不起作用?我之前在 api 中使用过这种模式,您可以修改响应以返回您需要的内容。
猜你喜欢
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2021-04-18
相关资源
最近更新 更多