Web API无法用utf-16编码的XML绑定POST模型
本文关键字:XML 绑定 POST 模型 编码 utf-16 API Web | 更新日期: 2023-09-27 18:11:59
我有一个简单的带有POST
方法的Web API控制器,它接受一个对象。当客户端将数据作为JSON
发布时,API工作正常。即使数据作为XML
与encoding="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);
在服务器端,这应该可以开箱即用。所以我猜问题出在你的POST上。内容类型标头应该有正确的编码。将XML中的header本身更改为encoding="utf-16"是不够的。试一试:
Content-Type: application/xml; charset=utf-16
你还需要在编码中发送数据,而不仅仅是改变头部