c# - Web API 无法使用 utf-16 编码的 XML 为 POST 绑定(bind)模型

标签 c# .net xml asp.net-web-api utf-16

我有一个带有 POST 方法的简单 Web API Controller ,它接受一个对象。当客户端将数据作为 JSON 发布时,API 工作正常。即使数据以 encoding="utf-8" 的形式作为 XML 发送,模型也会无缝绑定(bind)(我在 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>

但是,当使用 UTF-16 发布 XML 时,模型绑定(bind)失败并且 Controller 方法将 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);

最佳答案

在服务器端,这应该是开箱即用的。所以我想问题是你的帖子。内容类型 header 应具有正确的编码。将 XML 本身中的 header 更改为 encoding="utf-16"是不够的。 尝试:

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

您还需要以该编码实际发送数据,而不仅仅是更改 header 。

关于c# - Web API 无法使用 utf-16 编码的 XML 为 POST 绑定(bind)模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39919822/

相关文章:

C# 列表中的最小差异

c# - 'Newtonsoft.Json.Linq.JArray' 不包含定义

c# - 如何针对 Silverlight 编译 .NET 程序集?

c# - BaseClientService 不包含文件的定义

C# 迭代泛型对象

.net - 如何在没有 web.config 的情况下限制对文件夹中所有文件的访问

java - 具有 2 个对象适配器的 ListView 无法正常工作

android - 可绘制的android XML周围出现奇怪的黑色边框

c# - 在 C# 中实例化一个 python 类

xml - XPath/XSLT选择所有 sibling ,包括 self