如何配置.NET 6的ASP.NET Core Web API仅接受application/json?
配置.NET 6 ASP.NET Core Web API仅接受application/json作为Accept请求头
你可以通过两种常用方式实现这个需求:
方法一:自定义中间件
在请求进入MVC管道前直接检查Accept头,不符合要求则返回406状态码。在Program.cs中添加以下代码,注意要放在路由和端点配置之前:
// 自定义Accept头检查中间件 app.Use(async (context, next) => { var acceptHeader = context.Request.Headers.Accept.ToString(); // 若需要严格要求必须携带Accept头且值为application/json,可去掉!string.IsNullOrEmpty(acceptHeader)的判断 if (!string.IsNullOrEmpty(acceptHeader) && !acceptHeader.Equals("application/json", StringComparison.OrdinalIgnoreCase)) { context.Response.StatusCode = StatusCodes.Status406NotAcceptable; await context.Response.WriteAsync("仅接受application/json作为Accept请求头的值"); return; } await next(); }); // 后续的路由、授权、端点配置 app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
方法二:全局Action过滤器
创建一个自定义过滤器,然后全局注册到MVC配置中,这样所有控制器都会生效:
1. 创建过滤器类
public class AcceptHeaderValidationFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { var acceptHeader = context.HttpContext.Request.Headers.Accept.ToString(); // 同样可根据需求调整是否允许无Accept头的情况 if (!string.IsNullOrEmpty(acceptHeader) && !acceptHeader.Equals("application/json", StringComparison.OrdinalIgnoreCase)) { context.Result = new StatusCodeResult(StatusCodes.Status406NotAcceptable); } base.OnActionExecuting(context); } }
2. 全局注册过滤器
在Program.cs的MVC服务配置中添加过滤器:
builder.Services.AddControllers(options => { options.Filters.Add<AcceptHeaderValidationFilter>(); });
如果只需要对特定控制器或接口生效,也可以在对应控制器/Action上标记[AcceptHeaderValidationFilter]。
内容的提问来源于stack exchange,提问作者tRuEsAtM
相关产品推荐
相关产品推荐

