.Net Core:从自定义异常中间件返回IActionResult

时间:2019-12-11 21:08:21

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

我在.Net Core应用程序中创建了一个新的Exception中间件。整个应用程序中的所有异常均在此处捕获并记录。我想要从异常中间件返回IActionResult类型,例如InternalServerError()或NotFound(),而不执行response.WriteAsync,如下所示。

控制器方法:

select firstname, lastname, birth_date
from project.faculty
where TO_CHAR(birth_date,'Sun') = 'Jan'

中间件:

   public async Task<IActionResult> Post()
    {
        //Do Something
        return Ok();
    }

3 个答案:

答案 0 :(得分:0)

由于IActionResult和中间件在体系结构中彼此之间的相对位置,因此这实际上是不可能的。中间件的位置低得多,因此中间层无法到达IActionResult。这是一个更多讨论的答案:https://stackoverflow.com/a/43111292/12431728

答案 1 :(得分:0)

IActionResult是MVC的产品,因此仅在MVC管道(包括Razor Pages)中可用。在MVC中间件终止之前,它将使用ExecuteAsync 执行这些动作结果。然后,该方法负责将响应写入HttpContext.Response

因此在自定义中间件中,由于您不在MVC管道中运行,因此不能仅设置动作结果并执行它。但是,有了这些知识,您就可以自己执行结果。

假设您要执行NotFoundResult创建的Controller.NotFound()。因此,您创建该结果并使用调用ExecuteAsync。该执行者将能够执行该结果对象并写入响应:

var result = new NotFoundResult();
await result.ExecuteAsync(new ActionContext
{
    HttpContext = context,
});

答案 2 :(得分:0)

您要尝试执行的操作只需添加以下行即可完成:

hxnormalize

到Startup.cs中的Configure方法。然后,您可以使用以下方法创建带有错误的公共控制器:

app.UseStatusCodePagesWithReExecute("/Public/Error", "?statusCode={0}");

还有另一种中间件,可以让您做类似的事情:

[AllowAnonymous]
public IActionResult Error(int? statusCode = null)
{
    // Retrieve error information in case of internal errors.
    var error = HttpContext.Features.Get<IExceptionHandlerFeature>()?.Error;
    var path = HttpContext.Features.Get<IExceptionHandlerPathFeature>()?.Path;

    // TODO: Redirect here based on your status code or perhaps just render different views for different status codes.
}