如何在C#.NET API中移除JSON响应的XML包裹头
解决C#.NET API返回JSON被XML头包裹的问题
以下是几种直接有效的解决方式,根据你的项目类型选择适配方案:
1. 全局禁用XML格式化器(ASP.NET Core/.NET 6+)
在Program.cs中配置服务时,移除XML相关的输出格式化器,强制API默认返回JSON:
builder.Services.AddControllers(options => { // 移除两种XML格式化器 options.OutputFormatters.RemoveType<XmlDataContractSerializerOutputFormatter>(); options.OutputFormatters.RemoveType<XmlSerializerOutputFormatter>(); }) .AddJsonOptions(options => { // 按需配置JSON序列化规则,比如小驼峰命名 options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; });
如果需要保留XML格式化能力但强制优先返回JSON,可以改为:
builder.Services.AddControllers(options => { options.RespectBrowserAcceptHeader = false; // 忽略请求的Accept头,不做内容协商 options.ReturnHttpNotAcceptable = true; // 将JSON格式化器移到最前面,设为默认 var jsonFormatter = options.OutputFormatters.OfType<SystemTextJsonOutputFormatter>().First(); options.OutputFormatters.RemoveType<SystemTextJsonOutputFormatter>(); options.OutputFormatters.Insert(0, jsonFormatter); });
2. 控制器/Action级别强制返回JSON
在控制器或单个Action上添加[Produces("application/json")]特性,明确指定输出格式:
[ApiController] [Route("api/[controller]")] [Produces("application/json")] // 该控制器下所有Action默认返回JSON public class DataController : ControllerBase { [HttpGet] public IActionResult GetJsonData() { var responseData = new { Id = 123, Content = "示例数据" }; // 两种返回方式都可以:明确返回JsonResult,或用Ok()配合Produces特性 return Json(responseData); // return Ok(responseData); } }
3. 检查并移除XML相关中间件
排查Program.cs中是否存在注册XML处理中间件的代码(比如app.UseXmlSerializer()),如果有直接移除即可。
验证方法:调用API后查看响应头的Content-Type,确认值为application/json,同时检查响应内容是否为纯JSON文本,无XML头包裹。
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

