设置响应状态码对Web api核心无效

问题描述

AspNetCore 3.1.3

我正在尝试编写自定义错误结果,以便在必要时始终如一地将其返回给用户。 我首先从StatusCodeResult继承并覆盖ExecuteResult方法,如下所示:

public override void ExecuteResult(ActionContext context)
{
    base.ExecuteResult(context);
    var bytes = Encoding.UTF8.GetBytes(ErrorMessage);
    context.HttpContext.Response.Body.Write(bytes,bytes.Length);
}

然后我意识到我所写的响应主体被完全忽略了,而响应是

status: 422
title: "Unprocessable Entity"
traceId: "|5c53f94f-4826199e14151b80."
type: "https://tools.ietf.org/html/rfc4918#section-11.2"

尝试了所有可以想到的方法来更改主体,但是框架只是自动覆盖了该内容,因此我找不到有关位置或方式的信息。

然后我继续扩展IClientErrorActionResult,以实现如下所示的界面:

public async Task ExecuteResultAsync(ActionContext context)
{
    var bytes = Encoding.UTF8.GetBytes(ErrorMessage);
    context.HttpContext.Response.StatusCode = 422;
    await context.HttpContext.Response.Body.WriteAsync(bytes,bytes.Length);
    await context.HttpContext.Response.CompleteAsync();
}

这次,响应的主体与我编写的内容匹配,但是StatusCode始终自动更改为200,即使我在编写响应之前将其设置为422。

我的问题是:如何更改从StatusCodeResult返回的主体,或使框架尊重我在StatusCode的'ExecuteResultAsync'方法中设置的IActionResult

此外,如果有人能指出我在此处发生的情况,这些覆盖发生的位置以及原因的任何文档,

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)