You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET 5.0 Web API(C#) 如何不使用HttpResponseMessage返回406响应

解决方案

基础实现(直接返回406响应)

ASP.NET 5 及以上版本中,ControllerBase 内置了通用的 StatusCode 方法,无需依赖 HttpResponseMessage 即可返回任意状态码的响应:

using Microsoft.AspNetCore.Http;

// 控制器内直接调用即可返回406响应
return StatusCode(StatusCodes.Status406NotAcceptable);

携带自定义错误信息

StatusCode 方法支持重载传入第二个参数作为响应内容,你可以返回任意自定义的错误对象:

return StatusCode(StatusCodes.Status406NotAcceptable, new 
{
    ErrorCode = "ContentNegotiationFailed",
    ErrorMessage = "当前接口不支持请求指定的Accept媒体类型"
});

封装为内置方法风格的扩展(可选)

如果你想要和 Ok()、NotFound() 等内置方法保持一致的调用风格,可以自行封装扩展方法:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;

public static class ControllerBaseExtensions
{
    /// <summary>
    /// 返回406 Not Acceptable响应
    /// </summary>
    /// <param name="value">响应返回的自定义内容</param>
    public static IActionResult NotAcceptable(this ControllerBase controller, object value = null)
    {
        return controller.StatusCode(StatusCodes.Status406NotAcceptable, value);
    }
}

封装后可在控制器中直接调用:

// 无内容返回406
return NotAcceptable();

// 带自定义错误内容返回406
return NotAcceptable(new { Message = "请求参数不合法" });
原方案问题说明

你之前使用 HttpResponseMessage 出现状态码异常的原因是:.NET Core 3.0 及之后版本默认不启用 HttpResponseMessage 格式化器,框架会将 HttpResponseMessage 作为普通对象序列化返回,而不会将其解析为HTTP响应报文,因此会出现状态码显示错误的问题。


内容的提问来源于stack exchange,提问作者Kevin Stephen Biswas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:36:06