ASP.NET控制器默认响应媒体类型设置问题
为支持多媒体类型的ASP.NET控制器设置默认响应格式
当你在控制器的[Produces]属性中添加多种媒体类型后,无Accept请求头时的默认响应格式由ASP.NET Core的输出格式器集合顺序决定,而非[Produces]的参数顺序,所以调整参数顺序不会生效。以下是两种可行的解决办法:
方法一:全局配置默认格式优先级
在项目的Program.cs(.NET 6+)或Startup.cs(.NET 5及更早版本)中,调整输出格式器的顺序,将XML格式器置于JSON格式器之前,这样无Accept头时会优先选择XML作为响应格式:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(options => { // 获取XML输出格式器实例 var xmlFormatter = options.OutputFormatters.OfType<XmlSerializerOutputFormatter>().FirstOrDefault(); if (xmlFormatter != null) { // 移除原有XML格式器,再插入到格式器集合的最前端 options.OutputFormatters.Remove(xmlFormatter); options.OutputFormatters.Insert(0, xmlFormatter); } // 可选配置:当请求的Accept头不被支持时,返回406 Not Acceptable状态码 options.ReturnHttpNotAcceptable = true; }) // 确保XML格式器已被添加(若项目未默认启用) .AddXmlSerializerFormatters(); var app = builder.Build(); // 注册中间件等其他配置... app.MapControllers(); app.Run();
方法二:针对单个控制器/动作的细粒度控制
如果仅需让特定控制器使用XML作为默认响应格式,可通过动作过滤器强制设置默认响应类型:
public class DefaultXmlResponseFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { } public void OnActionExecuted(ActionExecutedContext context) { // 仅当响应未指定Content-Type且请求无Accept头时,设置默认XML格式 if (context.HttpContext.Request.Headers.Accept.Count == 0 && string.IsNullOrEmpty(context.HttpContext.Response.ContentType)) { context.HttpContext.Response.ContentType = MediaTypeNames.Application.Xml; } } } // 在目标控制器上应用过滤器 [Produces(MediaTypeNames.Application.Xml, MediaTypeNames.Application.Json)] [ServiceFilter(typeof(DefaultXmlResponseFilter))] public class MyController : ControllerBase { // 控制器实现逻辑 }
同时别忘了在服务中注册过滤器:
builder.Services.AddScoped<DefaultXmlResponseFilter>();
内容的提问来源于stack exchange,提问作者Mareek
相关产品推荐
相关产品推荐

