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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:03:13