【问题标题】:ASP.NET Web API - Model Binding not working with XML data on POSTASP.NET Web API - 模型绑定不适用于 POST 上的 XML 数据
【发布时间】: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。关于我在这里缺少什么的任何建议?

谢谢,
跳过

【问题讨论】:

    标签: asp.net-web-api


    【解决方案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;
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2015-08-30
    相关资源
    最近更新 更多