.Net Core 2 Accept Header of XML 返回 406

.Net Core 2 Accept Header of XML returning 406

我已经为我的 API 解决方案添加了针对 xml 的输出格式化和输入格式化

//add formatter to support XML media type results(application/xml)
setupAction.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
//add formatter to support XML media type request(application/xml)
setupAction.InputFormatters.Add(new XmlDataContractSerializerInputFormatter());

但是当我使用 application/xml 的接受 header 发出请求时,我得到一个 406 有其他人 运行 进入这个吗?

内容类型为application/json

---- 已修复 ----

如果控制器操作 returns 的 object 具有构造函数并且接受 header 是 application/xml 那么响应将是 406。只需删除构造函数,然后我可以 return XML。

回复。 "If the object that the controller action returns has a constructor and the accept header is application/xml then the response will be a 406." 实际上,这是不正确的。更正:"If the object that the controller action returns has a constructor that takes arguments, and the object also has no 0-argument constructor, and the accept header is application/xml then the response will be a 406."

我有同样的问题(.Net Core 2.2)。

由于此页面上的注释:https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-2.2

我检查了我的控制器是否继承自 Controller,并且我的方法正在返回 IActionResult。原来如此。

起初我添加了这个输出格式化程序:

  setupAction.OutputFormatters.Add(new XmlSerializerOutputFormatter());

尽管格式化程序在输出格式化程序列表中并且具有正确的 MediaType,但这并没有奏效。

然后我改为使用首选的 .Net 2.2 方式:

        services.AddMvc(setupAction => 
        { 
               ...
        })
        .AddXmlSerializerFormatters();

仍然没有成功。

我回到 "old" 方式并删除了 AddXmlSerializerFormatters() 并添加了

 setupAction.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());

即使用 XmlDataContractSerializerOutputFormatter 而不是 XmlSerializerOutputFormatter。

然后就成功了。

我花了一些时间来找出差异,我的猜测是 XmlSerializerOutputFormatter 可以编写 IEnumerable 的对象类型,而 Customer 是没有构造函数的 POCO。

这是日志中使用 XmlSerializerOutputFormatter 的内容 Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector:警告:未找到用于写入响应的内容类型 'application/xml' 的输出格式化程序。 Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor:警告:未找到内容类型 'application/xml' 的输出格式化程序来写入响应。

Actually, I had the same problem, In my case I have a relationship in my tables, so, Entity Framework create a IEnumerable<Class> when you have HasMany, so what I did was just change my code 
from:
public ICollection<Credential> Credential { get; set; }

to:
public List<Credential> Credential { get; set; }

and Constructor from:
        public Personal()
        {
            Credential = new HashSet<Credential>();
        }
to:
        public Personal()
        {
            Credential = new List<Credential>();
        }