相当于.net Core webapi 2的HttpResponseException/IHttpActionResponse(不是mvc)

Nei*_*ker 24 c# asp.net-core asp.net-core-webapi

当我阅读关于webapi以响应请求和处理错误时,一切都基于:

IHttpActionResult
HttpResponseException
Run Code Online (Sandbox Code Playgroud)

但是当您创建.net核心webapi项目时,这些项目不可用.我能找到IActionResult,它似乎相当于?

但是我要绕圈试图找出一个非常简单的东西,即如何处理.net核心webapi中的错误,因为HttpResponseException不可用.我得到的印象是"http"中的所有内容,仅适用于完整的MVC应用程序.

我想做的就是返回一个错误,当然它必须简单......

Kir*_*kin 31

IActionResultIHttpActionResult就像你建议的那样相当于.这是ASP.NET Core MVC中所谓的MVC和Web API的整合的一部分.

至于HttpResponseException,这已在ASP.NET Core中完全删除.在GitHub上有一个有趣的问题,David Fowler解释了为什么会出现这种情况:

只是经典,"我们不希望人们使用控制流的例外"范例.人们做的事情就是从他们的业务逻辑中使用它,这是各种各样的错误.我无法谈论性能问题,因为我没有测量但是抛出一个异常,意味着要获取一些数据比仅返回结果更糟糕.

建议的替代方法是使用各种IActionResult实现来创建JSON响应,返回错误等.再次,从问题:

我的建议是让action方法返回IActionResult(或async变体).

支持IActionResult和对象的原因是它们各自适合不同的目的和不同的风格.对于一些最简单的情况,使用对象很好,但它根本不强大.为了完全控制,有IActionResult,它遵循众所周知的"命令模式".

IActionResult模式允许控制器显式声明作为操作结果应该发生的事情:某种错误代码,重定向,序列化数据对象,渲染视图等.

如果您正在寻找处理控制器之外的错误,您可能会从阅读有关此主题的文档中受益,该文档将详细介绍使用中间件或过滤器进行错误处理.在评论中,有一个指向教程的链接,可以更详细地解释错误处理的某些方面.

为了完整起见,这里是中间件方法教程中的代码:

app.UseExceptionHandler(
 options => {
    options.Run(
    async context =>
    {
      context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
      context.Response.ContentType = "text/html";
      var ex = context.Features.Get<IExceptionHandlerFeature>();
      if (ex != null)
      {
        var err = $"<h1>Error: {ex.Error.Message}</h1>{ex.Error.StackTrace }";
        await context.Response.WriteAsync(err).ConfigureAwait(false);
      }
    });
 }
);
Run Code Online (Sandbox Code Playgroud)

关于这种IExceptionFilter方法还有更多细节,但我不会比现在更大.

  • https://learn.microsoft.com/en-us/aspnet/core/web-api/handle-errors?view=aspnetcore-6.0#use-exceptions-to-modify-the-response 说我们可以创建自己的异常名为“HttpResponseException”的类型 (2认同)