ASP.NET Web API - 模型绑定不适用于 POST 上的 XML 数据
Posted
技术标签:
【中文标题】ASP.NET Web API - 模型绑定不适用于 POST 上的 XML 数据【英文标题】:ASP.NET Web API - Model Binding not working with XML data on POST 【发布时间】:2012-10-10 04:36:43 【问题描述】:在使用带有 ASP.NET Web API 的 XML 数据进行 POST 时,我无法让模型绑定工作。 JSON 数据工作正常。
使用全新的 Web API 项目,这是我的模型类:
public class Person
public string FirstName get; set;
public string LastName get; set;
public class PostResponse
public string ResponseText get; set;
这是我在控制器中的 post 方法:
public PostResponse Post([FromBody]Person aPerson)
var responseObj = new PostResponse();
if (aPerson == null)
responseObj.ResponseText = "aPerson is null";
return responseObj;
if (aPerson.FirstName == null)
responseObj.ResponseText = "First Name is null";
return responseObj;
responseObj.ResponseText = string.Format("The first name is 0", aPerson.FirstName);
return responseObj;
我可以使用 Fiddler 的 JSON 成功运行它:
请求标头: 用户代理:提琴手 主机:本地主机:49188 内容类型:应用程序/json;字符集=utf-8 内容长度:38
请求正文: "FirstName":"Tom","LastName":"Jones"
结果: "ResponseText":"名字是汤姆"
在传入 XML 时,Person 对象未正确水合:
请求标头: 用户代理:提琴手 主机:本地主机:49188 内容类型:文本/xml 内容长度:79
请求正文:汤姆名字>琼斯姓氏>人>
结果:
aPerson 为空
据我了解,XML 应该类似于 JSON。关于我在这里缺少什么的任何建议?
谢谢, 跳过
【问题讨论】:
【参考方案1】:将此添加到您的WebApiConfig.cs
:
config.Formatters.XmlFormatter.UseXmlSerializer = true;
这迫使 Web API 使用 XMLSerializer 而不是 DataContractSerializer,并允许您传递原始 XML。
否则,您必须通过完全限定的数据合同 XML,即:
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Test.WebAPI.Controllers">
<FirstName>a</FirstName>
<LastName>b</LastName>
</Person>
【讨论】:
很高兴你还活着,Flip! :) 对于仍然获得空模型的任何人,找出问题所在的提示是简单地通过 Request.Content.ReadAsStringAsync() 获取请求内容并尝试使用 XmlSerializer 自己反序列化 XML。如果出现问题,XmlSerializer 不会像 Web API 那样只返回 null,而是会抛出一个异常,告诉您为什么它不能反序列化。就我而言,这就是我发现我的 XML 声明声明了 UTF-16 编码而请求本身是 UTF-8 编码的方式。如果不自己进行反序列化,这是我永远不会想到的。 +1 @Bas - 几乎为我工作。我不得不花哨并这样做:Request.Content.ReadAsStreamAsync().Result.Seek(0, System.IO.SeekOrigin.Begin);字符串结果 = Request.Content.ReadAsStringAsync().Result;以上是关于ASP.NET Web API - 模型绑定不适用于 POST 上的 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章
模型绑定不适用于 asp.net 核心 Web api 控制器操作方法中的 Stream 类型参数。(即使使用自定义流输入格式化程序)
如果参数名称等于属性名称,则来自查询的 ASP.NET Core Web API 复杂类型绑定不起作用