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 Core 1 Web API 模型绑定数组

模型绑定不适用于 asp.net 核心 Web api 控制器操作方法中的 Stream 类型参数。(即使使用自定义流输入格式化程序)

如果参数名称等于属性名称,则来自查询的 ASP.NET Core Web API 复杂类型绑定不起作用

如何自定义 ASP.Net Core 模型绑定错误?

ASP.NET 5 MVC 6 RC1 API 中的自定义模型绑定异常

ASP.NET Web API中的参数绑定总结