我在.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();
}
答案 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.
}