如何在 asp.net core 2.1 中使用自定义消息设置状态代码?

Posted

技术标签:

【中文标题】如何在 asp.net core 2.1 中使用自定义消息设置状态代码?【英文标题】:How do I set the status code with custom message in asp.net core 2.1? 【发布时间】:2019-09-08 11:21:37 【问题描述】:

我正在使用 2.1 版 asp.net 核心,我创建了一个示例 API 项目,该项目运行良好,但我无法使用自定义消息修改状态代码,例如:

在邮递员中:

200 正常

期待:

200 自定义消息

我试过的代码:

[HttpGet]
public IActionResult Get()

     Response.StatusCode = 200;
     Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = "Custom_Message";
     return Ok();

邮递员的当前输出:

GitHub Repository

【问题讨论】:

return Content("Custom_Message") @SlavaUtesinov 它在正文中附加了“Custom_Message”值。我希望该消息显示在 200 旁边 你显示的代码对我有用。 @KirkLarkin 好的,在屏幕截图中:它显示的是 200 OK 和我想要的 200 Custom_Message。如果这是您所得到的,请随时发布答案 @KirkLarkin 将添加它 【参考方案1】:

我认为您应该创建自定义类:

public class CustomResult : OkResult

    private readonly string Reason;

    public CustomResult(string reason) : base()
    
        Reason = reason;
    

    public override void ExecuteResult(ActionContext context)
    
        if (context == null)
        
            throw new ArgumentNullException(nameof(context));
        

        context.HttpContext.Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = Reason;
        context.HttpContext.Response.StatusCode = StatusCode;
    

然后在你的控制器方法中:

[HttpGet]
public IActionResult Get()

     return new CustomResult("Custom reason phrase");

输出

【讨论】:

我想问题不在于代码,因为正如 cmets 中报告的那样,您的代码也可以很好地工作。您是否调用了正确的方法?这也与.NET Core 2.1 兼容,所以我不知道出了什么问题。 你应该改变继承而不是状态码。因此,例如,如果您想使用400 作为状态码,您应该将: OkResult 更改为: BadRequestResult @PrashantPimpale 对不起,我看错了,所以它适用于每个状态代码,但不适用于 200?这真的很奇怪 是的,我也无法理解为什么这对 200 不起作用【参考方案2】:
[ApiController]
[Route("api/vversion:apiVersion/[controller]")]
public abstract class BaseApiController : ControllerBase

    public override OkResult Ok()
    
        return base.Ok();
    

    public override OkObjectResult Ok([ActionResultObjectValue] object value)
    
        return base.Ok(new Response
        
            Result = value,
            Status = ResultStatus.Success,
            Message = string.Empty
        );
    

【讨论】:

以上是关于如何在 asp.net core 2.1 中使用自定义消息设置状态代码?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.1 Jwt 设置自定义声明

带有 Windows 身份验证的 ASP.NET Core 2.1 自定义 RoleProvider

如何在 asp.net core 2.1 中使用 net.tcp 服务

ASP.Net Core 2.1 中的身份< - 自定义 AccountController

有没有办法在 ASP.NET Core 2.1 中捕获对 Razor 页面不存在的自定义处理程序的 HTTP 请求?

如何在 ASP.NET Core 2.1 中使用自动完成输入引发模式