ASP.NET Core 8 Web API无法返回XML,请求XML时出现406错误
解决ASP.NET Core 8 Web API URL后缀返回XML时406错误的问题
常见原因及修复方案
1. 模型不满足XmlSerializer的序列化要求
XmlSerializer对模型有严格的序列化规则,一旦不满足就会触发406错误:
- 必须有无参公共构造函数
- 需要序列化的属性必须是公共可读写的
- 存在循环引用时,需用
[XmlIgnore]标记循环引用属性,或者换用其他序列化器
示例修正后的模型:
public class SampleModel { // 必须添加无参构造函数 public SampleModel() { } public int Id { get; set; } public string Name { get; set; } // 标记循环引用属性为忽略序列化 [XmlIgnore] public SampleModel Parent { get; set; } }
2. 路由未配置格式后缀占位符
控制器路由模板必须包含{format?},否则FormatFilter无法识别URL后缀中的格式标识:
控制器代码示例:
[ApiController] [Route("api/[controller]/{id}.{format?}")] // 必须包含{format?}占位符 [FormatFilter] public class SampleController : ControllerBase { [HttpGet] public IActionResult Get(int id) { var model = new SampleModel { Id = id, Name = "Test Sample" }; return Ok(model); } }
3. XML格式器配置不完整或冲突
在Program.cs中需确保XML格式器被正确注册,且没有被后续配置覆盖:
Program.cs示例:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(options => { // 显式绑定格式后缀与对应媒体类型 options.FormatterMappings.SetMediaTypeMappingForFormat("xml", MediaTypeHeaderValue.Parse("application/xml")); options.FormatterMappings.SetMediaTypeMappingForFormat("json", MediaTypeHeaderValue.Parse("application/json")); }) .AddXmlSerializerFormatters(); // 关键:添加XML序列化格式器 var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
4. 替换为XmlDataContractSerializer
如果你的模型无法满足XmlSerializer的要求(比如无法添加无参构造函数),可以改用XmlDataContractSerializer:
在Program.cs中替换格式器配置:
builder.Services.AddControllers() .AddXmlDataContractSerializerFormatters();
验证步骤
- 修正配置后重启API服务
- 调用
https://localhost:44347/api/Sample/1.xml检查返回结果 - 若仍有问题,可查看请求头的
Accept字段——虽然FormatFilter优先URL后缀,但如果Accept被强制设置为application/json,可能会影响结果,可临时移除该头再测试
内容的提问来源于stack exchange,提问作者lalita zarei
相关产品推荐
相关产品推荐

