当我阅读关于webapi以响应请求和处理错误时,一切都基于:
IHttpActionResult
HttpResponseException
但是当您创建.net核心webapi项目时,这些项目不可用。我能找到IActionResult,它似乎是等价的吗?
但是我试图找出一个非常简单的东西,这是如何处理.net核心webapi中的错误,因为HttpResponseException不可用。我通过' http'在其中,仅适用于完整的MVC应用程序。
我想做的就是返回一个错误,当然它必须简单......
答案 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
方法的详细信息,但我不会让这个答案比现在更大。