.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(已过时)?.NET 6+ 推荐统一用
ices.AddMvc()
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修改字段类型方法总结


