我正在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, "");
}
它基本上是一个令牌和一个 t 列表
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 绑定所有内容。到目前为止,我无法做到这一点。
谢谢
再增加一门课
[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; }
...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句