【问题标题】:Rest Web Api XML Bind - Asp.Net MVCRest Web Api XML 绑定 - Asp.Net MVC
【发布时间】:2018-06-07 03:29:06
【问题描述】:

我正在一个 rest asp net web api 中创建一个 post 方法来通过 json 或 xml 接收数据。我需要处理我无法更改的特定 xml 结构:

<data>
 <t>
    <id>sample string 1</id>
    <cnpj>sample string 2</cnpj>
    <datatransacao>sample string 3</datatransacao>
    <valorarredondado>sample string 4</valorarredondado>
    <grupo>sample string 5</grupo>
    <meiopagamento>sample string 6</meiopagamento>
    <parcelas>sample string 7</parcelas>
    <cpf>sample string 8</cpf>
    <nome>sample string 9</nome>
    <email>sample string 10</email>
    <codoperador>sample string 11</codoperador>
  </t>
  <t>
    <id>sample string 1</id>
    <cnpj>sample string 2</cnpj>
    <datatransacao>sample string 3</datatransacao>
    <valorarredondado>sample string 4</valorarredondado>
    <grupo>sample string 5</grupo>
    <meiopagamento>sample string 6</meiopagamento>
    <parcelas>sample string 7</parcelas>
    <cpf>sample string 8</cpf>
    <nome>sample string 9</nome>
    <email>sample string 10</email>
    <codoperador>sample string 11</codoperador>
  </t>
</data>

为了实现这一点,我创建了一个方法:

[HttpPost]
public HttpResponseMessage Post([FromUri] string Token, [FromBody] List<t> data)
{
    return Request.CreateResponse(HttpStatusCode.OK, "");
}

它基本上是一个token和一个t的List

public class t
{
    public string id { get; set; }
    public string cnpj { get; set; }
    public string datatransacao { get; set; }
    public string valorarredondado { get; set; }
    public string grupo { get; set; }
    public string meiopagamento { get; set; }
    public string parcelas { get; set; }
    public string cpf { get; set; }
    public string nome { get; set; }
    public string email { get; set; }
    public string codoperador { get; set; }
}

有了这个,我在测试时得到了 data 参数的空值。一切都正确绑定,只有在发送时:

<ArrayOfT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <t>
    <id>sample string 1</id>
    <cnpj>sample string 2</cnpj>
    <datatransacao>sample string 3</datatransacao>
    <valorarredondado>sample string 4</valorarredondado>
    <grupo>sample string 5</grupo>
    <meiopagamento>sample string 6</meiopagamento>
    <parcelas>sample string 7</parcelas>
    <cpf>sample string 8</cpf>
    <nome>sample string 9</nome>
    <email>sample string 10</email>
    <codoperador>sample string 11</codoperador>
  </t>
  <t>
    <id>sample string 1</id>
    <cnpj>sample string 2</cnpj>
    <datatransacao>sample string 3</datatransacao>
    <valorarredondado>sample string 4</valorarredondado>
    <grupo>sample string 5</grupo>
    <meiopagamento>sample string 6</meiopagamento>
    <parcelas>sample string 7</parcelas>
    <cpf>sample string 8</cpf>
    <nome>sample string 9</nome>
    <email>sample string 10</email>
    <codoperador>sample string 11</codoperador>
  </t>
</ArrayOfT>

我的 api 当前设置为使用 Xmlserializer

config.Formatters.XmlFormatter.UseXmlSerializer = true;

在我的测试中,我设法自己用代码序列化了 xml:

var postStream = Request.Content.ReadAsStreamAsync().Result;
postStream.Seek(0, SeekOrigin.Begin);
string postBodyString = new StreamReader(postStream).ReadToEnd();

StringReader stringReader = new StringReader(postBodyString);
XmlSerializer serializer = new XmlSerializer(typeof(List<t>), new XmlRootAttribute("data"));
List<t> ListOfT = (List<t>)serializer.Deserialize(stringReader);

我想知道是否有可能让框架绑定所有内容,只考虑该方法与该 xml 的签名。到目前为止,我无法做到这一点。

谢谢

【问题讨论】:

    标签: asp.net asp.net-web-api


    【解决方案1】:

    再增加一个类

    [XmlRoot(ElementName = "data")]
    public class Data {
        [XmlElement(ElementName = "t")]
        public List<t> data { get; set; }
    }
    

    将其用作方法的参数。它应该正确绑定。

    [HttpPost]
    public HttpResponseMessage Post([FromUri] string Token, [FromBody] Data data)
    

    还将 XmlRoot 属性添加到您的 t 类中

    [XmlRoot(ElementName = "t")]
    public class t
    {
        public string id { get; set; }
        public string cnpj { get; set; }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 2012-06-06
      • 2012-03-08
      • 1970-01-01
      • 2023-03-22
      • 2012-08-28
      • 1970-01-01
      相关资源
      最近更新 更多