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
相关产品推荐
相关产品推荐

