.NET 7+的Minimal APIs如何定义XML上传端点
发布时间 - 2026-02-01 00:00:00 点击率:次Minimal APIs 默认不支持 XML 请求体解析,需手动注册 XmlSerializerInputFormatter 并添加 Microsoft.AspNetCore.Mvc.Formatters.Xml 包;模型须用 [XmlRoot] 等标记且含无参构造函数,Content-Type 必须严格为 application/xml 或 text/xml。
Minimal APIs 默认不支持 XML 请求体解析
Minimal APIs 在 .NET 7+ 中默认只注册了 application/json 和 text/plain 的输入格式化器(InputFormatter),遇到 application/xml 或 text/xml 会直接返回 415 Unsupported Media Type。这不是路由或模型绑定写错了,而是底层没启用 XML 支持。
必须手动注册 XmlSerializerInputFormatter
要让 Minimal API 接收 XML 请求体,得在 Program.cs 中显式添加 XML 输入格式化器,并指定它处理哪些 MIME 类型。注意:.NET 7+ 默认用的是 XmlSerializer,不是 DataContractSerializer,所以模型类需用 [XmlRoot]、[XmlElement] 等标记,且必须有无参构造函数。
- 安装 NuGet 包:
Micro
soft.AspNetCore.Mvc.Formatters.Xml
- 调用
AddXmlSerializerFormatters()(不是AddXmlDataContractSerializerFormatters) - 该方法会注册
application/xml、text/xml和application/soap+xml
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); // 必须加,Minimal API 的 XML 支持依赖 MVC 服务 builder.Services.AddXmlSerializerFormatters(); var app = builder.Build(); app.MapControllers(); // 启用控制器风格的端点(含 ModelBinding) app.Run();
定义 XML 上传端点要用 MapPost + FromBody
Minimal API 的 MapPost 本身不支持自动绑定 XML,必须配合 MVC 的控制器机制或显式使用 FromBody —— 但后者在纯 Minimal API 路由中不可用。最稳妥做法是改用控制器风格端点,或在 MapPost 中手动读取原始流再反序列化。
- 推荐方式:用控制器(更清晰、复用已有绑定逻辑)
- 若坚持 Minimal API 风格:用
HttpContext.Request.Body读取字节流,再用XmlSerializer.Deserialize()手动解析 - 不要尝试给
MapPost参数加[FromBody]—— 它在 Minimal API 路由中无效
[ApiController]
[Route("api/[controller]")]
public class XmlUploadController : ControllerBase
{
[HttpPost("upload")]
public IActionResult Upload([FromBody] Person person)
{
if (person == null) return BadRequest();
return Ok(new { Received = person.Name });
}
}
// 对应的 XML 示例请求体:
//
// Alice
//
常见失败原因和绕过陷阱
即使注册了 XML 格式化器,仍可能 400 或 415,关键检查点:
- 请求头
Content-Type必须严格为application/xml或text/xml(大小写敏感,不能带参数如charset=utf-8) - 模型类字段名与 XML 元素名不匹配时,必须用
[XmlElement("xxx")]显式声明,不能依赖默认命名规则 -
XmlSerializer不支持Dictionary直接映射,需封装为数组或自定义类型 - 如果用了
System.Text.Json的属性标记(如[JsonPropertyName]),对 XML 绑定完全无效
XML 上传看似简单,但实际卡点都在 MIME 类型注册时机、序列化器选型、以及模型标记的精确性上——漏掉任一环都会静默失败或返回空对象。
# js
# json
# app
# 字节
# ai
# 路由
# microsoft
# .net
# mvc
# String
# 封装
# 构造函数
# xml
# 对象
# 不支持
# 绑定
# 的是
# 上传
# 序列化
# 都在
# 已有
# 错了
# 用了
# 这不是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel如何使用Collections进行数据处理?(实用方法示例)
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
高端建站如何打造兼具美学与转化的品牌官网?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在云主机上快速搭建网站?
清除minerd进程的简单方法
如何快速登录WAP自助建站平台?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
如何挑选优质建站一级代理提升网站排名?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
韩国服务器如何优化跨境访问实现高效连接?
Laravel如何优化应用性能?(缓存和优化命令)
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
实例解析Array和String方法
微信小程序 input输入框控件详解及实例(多种示例)
长沙企业网站制作哪家好,长沙水业集团官方网站?
Laravel如何使用查询构建器?(Query Builder高级用法)
昵图网官网入口 昵图网素材平台官方入口
Laravel集合Collection怎么用_Laravel集合常用函数详解
Laravel如何创建自定义中间件?(Middleware代码示例)
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
高防服务器租用首荐平台,企业级优惠套餐快速部署
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
如何在Windows 2008云服务器安全搭建网站?
如何注册花生壳免费域名并搭建个人网站?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
zabbix利用python脚本发送报警邮件的方法
网站建设整体流程解析,建站其实很容易!
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】


