.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/jsontext/plain 的输入格式化器(InputFormatter),遇到 application/xmltext/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/xmltext/xmlapplication/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/xmltext/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结构化提示词写法【教程】