.NET Web API如何配置XML格式化器

发布时间 - 2026-02-02 00:00:00    点击率:
.NET 6+ Web API 默认不支持 XML 响应,因移除了 XmlSerializerOutputFormatter,需手动安装 Microsoft.AspNetCore.Mvc.Formatters.Xml 包并注册该格式化器,且模型须满足无参构造、public 属性等要求。

为什么默认不支持 XML 响应

.NET 6+ 的 Web API 模板默认只注册 SystemTextJsonOutputFormatter,完全移除了对 XML 的自动支持。即使你返回 IActionResult 或启用了 [Produces("application/xml")],请求带 Accept: application/xml 也会直接 406 Not Acceptable。

添加 XmlSerializerOutputFormatter 的正确方式

必须显式注册基于 XmlSerializer 的格式化器(XmlDataContractSerializer 已被弃用且不推荐用于 Web API)。注意:.NET 5+ 不再内置 XML 支持包,需先安装 NuGet 包:

dotnet add package Microsoft.AspNetCore.Mvc.Formatters.Xml

然后在 Program.cs 中注册:

builder.Services.AddControllers(options =>
{
    options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
    // 可选:禁用默认的 JSON 格式化器(仅需 XML 时)
    // options.OutputFormatters.RemoveType();
});

关键点:

  • XmlSerializerOutputFormatter 要求模型类有无参构造函数,且属性必须是 public get/set
  • 不支持 record 类型(会抛 InvalidOperationException: Type 'X' cannot be serialized
  • 若控制器方法返回 Task,确保实际返回值类型可被 XmlSerializer 序列化(如 Ok(MyModel)

处理 XML 请求(POST/PUT)

仅配置输出格式化器不够——接收 XML 请求体还需注册输入格式化器:

builder.Services.AddControllers(options =>
{
    options.InputFormatters.Add(new XmlSerializerInputFormatter(options));
    options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
});

此时需确保请求头包含 Content-Type: application/xml,且 XML 结构与模型字段名严格匹配(区分大小写,无命名空间更稳妥)。常见失败原因:

  • XML 根节点名 ≠ 模型类名(XmlRoot 特性可覆盖)
  • 字段名含下划线或驼峰,但 XML 使用短横线(如 )→ 需加 [XmlElement("user-name")]
  • 传了空字符串给非 nullable 引用类型字段 → 反序列化失败

调试 406 或空响应的快速检查项

当 XML 响应不生效时,优先验证以下三点:

  • 是否漏装 Microsoft.AspNetCore.Mvc.Formatters.Xml 包?没有它,XmlSerializerOutputFormatter 类型根本不存在
  • 是否在 AddControllers() 后才调用 Build()?顺序错误会导致注册失效
  • 是否误用了 serv

    ices.AddMvc()
    (已过时)?.NET 6+ 推荐统一用 AddControllers() + AddEndpointsApiExplorer()
  • 是否在 Startup.Configure() 中忘了调用 app.UseRouting()app.UseEndpoints()?中间件链中断会导致格式化器不触发

XML 格式化器本身不处理缩进或编码声明,生成的 XML 默认无换行、UTF-8 无 BOM。如果需要美化输出,得自己封装 XmlWriterSettings 并继承 XmlSerializerOutputFormatter —— 这部分容易被低估工作量。


# js  # json  # 编码  # app  # microsoft  # .net  # 为什么  # mvc  # 中间件  # 命名空间  # 封装  # 构造函数  # xml  # 字符串  # 继承  # 值类型  # 引用类型  # public  # Nullable  # bom  # 不支持  # 移除  # 字段名  # 序列化  # 也会  # 已被  # 下划线  # 这部  # 不存在  # 可选 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何处理CORS跨域请求?(配置示例)  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何自定义建站之星模板颜色并下载新样式?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何快速搭建自助建站会员专属系统?  Laravel如何实现API速率限制?(Rate Limiting教程)  jQuery 常见小例汇总  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Linux系统命令中screen命令详解  Laravel如何使用Sanctum进行API认证?(SPA实战)  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel怎么使用artisan命令缓存配置和视图  EditPlus中的正则表达式实战(6)  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  浅谈Javascript中的Label语句  Python高阶函数应用_函数作为参数说明【指导】  北京网站制作的公司有哪些,北京白云观官方网站?  如何快速搭建高效简练网站?  如何在服务器上配置二级域名建站?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  如何用AWS免费套餐快速搭建高效网站?  详解jQuery中基本的动画方法  Java解压缩zip - 解压缩多个文件或文件夹实例  如何用搬瓦工VPS快速搭建个人网站?  JavaScript如何实现倒计时_时间函数如何精确控制  详解CentOS6.5 安装 MySQL5.1.71的方法  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何快速搭建二级域名独立网站?  如何用低价快速搭建高质量网站?  如何在VPS电脑上快速搭建网站?  如何快速查询网站的真实建站时间?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何用IIS7快速搭建并优化网站站点?  如何快速选择适合个人网站的云服务器配置?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Android自定义控件实现温度旋转按钮效果  java获取注册ip实例  在centOS 7安装mysql 5.7的详细教程  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Android okhttputils现在进度显示实例代码  清除minerd进程的简单方法  深圳网站制作平台,深圳市做网站好的公司有哪些?  详解阿里云nginx服务器多站点的配置  详解Oracle修改字段类型方法总结