XML-привязка Rest Web Api - Asp.Net MVC - PullRequest
0 голосов
/ 07 июня 2018

Я создаю метод post в остальном asp net web api для получения данных через 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; }
}

При этом я получаю нулевое значение для параметра данных при тестировании.Все связывается правильно, только если отправка:

<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 с помощьюcode:

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.Пока я не смог этого достичь.

Спасибо

1 Ответ

0 голосов
/ 07 июня 2018

Добавьте еще один класс

[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; }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...