Web API无法用utf-16编码的XML绑定POST模型

本文关键字:XML 绑定 POST 模型 编码 utf-16 API Web | 更新日期: 2023-09-27 18:11:59

我有一个简单的带有POST方法的Web API控制器,它接受一个对象。当客户端将数据作为JSON发布时,API工作正常。即使数据作为XMLencoding="utf-8"一起发送,模型也可以无缝绑定(我在WebApiConfig中添加了以下行以使用Xml Serialization而不是DataContract)

config.Formatters.XmlFormatter.UseXmlSerializer = true;
下面是我的ApiController:
public class InfoController : ApiController
{
    public HttpResponseMessage Post(InfoRequest infoRequest)
    {
        //do work and return something
        return Request.CreateResponse(HttpStatusCode.Accepted, infoRequest != null);
    }
}

与类型

public class InfoRequest
{
    public string Id { get; set; }
    public int Total { get; set; }
    public Status Status { get; set; }
}
public enum Status
{
    None = 0,
    Confirmed,
    Cancelled
}

现在当客户端请求以下数据集时,它工作正常

Content-Type: application/json
body:
{
    "Id": "ACARG021",
    "Total": 20,
    "Status": "Confirmed"
}

这个也可以,

Content-Type: application/xml
body:
<?xml version="1.0" encoding="utf-8"?>
<InfoRequest>
    <Id>ACARG021</Id>
    <Total>20</Total>
    <Status>Confirmed</Status>
</InfoRequest>

但是,当XML以UTF-16发布时,模型绑定失败,控制器方法获得null传递给它。

Content-Type: application/xml; charset=utf-16
//Accept-Charset: utf-16 //Edit: wrong header, removed
body:
<?xml version="1.0" encoding="utf-16"?>
<InfoRequest>
    <Id>ACARG021</Id>
    <Total>20</Total>
    <Status>Confirmed</Status>
</InfoRequest>

正如其他一些SO帖子所建议的那样,将此添加到WebApiConfig并没有帮助

Encoding utf16 = Encoding.GetEncoding("utf-16");
config.Formatters.XmlFormatter.SupportedEncodings.Add(utf16);

Web API无法用utf-16编码的XML绑定POST模型

在服务器端,这应该可以开箱即用。所以我猜问题出在你的POST上。内容类型标头应该有正确的编码。将XML中的header本身更改为encoding="utf-16"是不够的。试一试:

Content-Type: application/xml; charset=utf-16

你还需要在编码中发送数据,而不仅仅是改变头部