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

时间:2017-11-06 17:04:15

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

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

IHttpActionResult
HttpResponseException

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

但是我试图找出一个非常简单的东西,这是如何处理.net核心webapi中的错误,因为HttpResponseException不可用。我通过' http'在其中,仅适用于完整的MVC应用程序。

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

1 个答案:

答案 0 :(得分:22)

正如您所建议的,

IActionResult相当于IHttpActionResult。这是ASP.NET Core MVC中所谓的MVC和Web API的整合的一部分。

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

  

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

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

  

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

     

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

     

IActionResult模式允许控制器明确说明操作的结果:某种错误代码,重定向,序列化数据对象,渲染视图等。

如果您正在寻找处理控制器之外的错误,您可能会从阅读本主题的docs中受益,其中详细介绍了使用中间件或过滤器进行错误处理的细节。在评论中,有一个指向tutorial的链接,可以更详细地解释错误处理的某些方面。

为了完整起见,请参阅中间件方法教程中的代码:

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);
      }
    });
 }
);

还有更多关于IExceptionFilter方法的详细信息,但我不会让这个答案比现在更大。