Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 相当于.net核心webapi 2(非mvc)的HttpResponseException/IHttpActionResponse_C#_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# 相当于.net核心webapi 2(非mvc)的HttpResponseException/IHttpActionResponse

C# 相当于.net核心webapi 2(非mvc)的HttpResponseException/IHttpActionResponse,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,当我阅读有关响应请求和处理错误的webapi时,所有内容都基于: IHttpActionResult HttpResponseException 但是,当您创建.net核心webapi项目时,这些都不可用。我可以找到IActionResult,它似乎是等效的 但我正在周而复始地试图找到一件非常简单的事情,那就是如何处理.net核心webapi中的错误,因为HttpResponseException不可用。我得到的印象是,所有包含“http”的东西都是针对一个完整的MVC应用程序的 我所要做的就

当我阅读有关响应请求和处理错误的webapi时,所有内容都基于:

IHttpActionResult
HttpResponseException
但是,当您创建.net核心webapi项目时,这些都不可用。我可以找到IActionResult,它似乎是等效的

但我正在周而复始地试图找到一件非常简单的事情,那就是如何处理.net核心webapi中的错误,因为HttpResponseException不可用。我得到的印象是,所有包含“http”的东西都是针对一个完整的MVC应用程序的


我所要做的就是返回一个错误,当然它必须很简单…

IActionResult
正如您所建议的那样,它相当于
IHttpActionResult
。这是ASP.NET核心MVC中的MVC和Web API整合的一部分

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

这就是经典的“我们不希望人们使用异常控制流”范例。人们做了一些事情,比如从他们的业务逻辑中使用它,这完全是错误的。我不能谈论性能问题,因为我还没有进行测量,但是抛出一个异常以获取一些数据比仅仅返回结果更糟糕

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

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

IActionResult和object都受支持的原因是它们各自适合不同的用途和不同的样式。对于一些最简单的情况,使用object很好,但它一点也不强大。对于完全控制,有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);
      }
    });
 }
);
app.UseExceptionHandler(
选项=>{
选项。运行(
异步上下文=>
{
context.Response.StatusCode=(int)HttpStatusCode.InternalServerError;
context.Response.ContentType=“text/html”;
var ex=context.Features.Get();
如果(ex!=null)
{
var err=$“错误:{ex.Error.Message}{ex.Error.StackTrace}”;
wait context.Response.WriteAsync(err).configureWait(false);
}
});
}
);

还有更多关于
ieexceptionfilter
方法的细节,但我不会在这里重复所有内容。

但是,关于无效返回方法,例如PUT和POST呢?PUT和POST不需要是
void
-您仍然可以使用
IActionResult
并返回,例如
NoContent()
Ok()
。第一个会给出204,第二个会给出200。当我的代码捕获或出错时,如何返回500状态代码,有什么建议吗?如果你想处理控制器中的异常,你可以使用它。