C # Как игнорировать заголовок Xml в запросе к WebApi? - PullRequest
0 голосов
/ 10 октября 2018

Я создаю новый маршрут к моему WebApi, который должен получать следующий XML через HTTP POST

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AcquireKeysRequest>
  <version>2</version>
  <content>
    <id>MTV</id>
    <type>VOD</type>
  </content>
  <protection>
    <protection-system>
      <type>DASH-CENC</type>
      <system-id>urn:mpeg:dash:mp4protection:2011</system-id>
    </protection-system>
  </protection>
  <key-timing>
    <position>0</position>
  </key-timing>
</AcquireKeysRequest>

Я отобразил его через структуру, используя следующую модель:

public class AcquireKeysRequest
{
    public int Version { get; set; }
    public Content Content { get; set; }
    public Protection Protection { get; set; }
    public KeyTiming KeyTiming { get; set; }
}
public class Content
{
    public string Id { get; set; }
    public string Type { get; set; }
}

public class Protection
{
    public ProtecionSystem ProtectionSystem{ get; set; }
}

public class ProtecionSystem
{
    public string Type { get; set; }
    public string SystemId { get; set; }
}

public class KeyTiming
{
    public int Position { get; set; }
}

Когда я получаю запрос без заголовка

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

Отображение работает просто отлично, но когда я добавляю заголовок, он ломается. Как я могу это игнорировать?

    [HttpPost]
    [Route("{instanceId}")]
    public object AcquireKeyRequest([FromUri]int instanceId, AcquireKeysRequest xml)
    {
       //SomeLogicHere
    }

PS: я знаю, что имена в модели и в XML разные, я уже исправил в своем коде.

1 Ответ

0 голосов
/ 10 октября 2018

В вашем проекте MVC Web API добавьте следующий пакет через NuGet: Microsoft.AspNetCore.Mvc.Formatters.Xml

Затем в вашем файле startup.cs.Адаптируйте следующее, чтобы включить сериализацию и десериализацию XML.

 public void ConfigureServices(IServiceCollection services)
 {
    services.AddMvc(options =>
    {
       options.Filters.Add(new ProducesAttribute("application/xml"));
    }).AddXmlSerializerFormatters();
 }

Наконец, создайте метод Get и Post с контроллером и попробуйте его.У меня оба случая работают.С или без тега xml.

 [HttpGet]
 public AcquireKeysRequest Get()
 {
     AcquireKeysRequest req = new AcquireKeysRequest();
     req.KeyTiming = new KeyTiming() { Position = 2 };
     req.Protection = new Protection()
     {
         ProtectionSystem = new ProtecionSystem() {
              SystemId = "wkow", Type = "type"
         }
     };
     req.Version = 2;
     req.Content = new Content() { Id = "id", Type = "type" };
     return req;
 }

 [HttpPost]
 public void Post([FromBody]AcquireKeysRequest value)
 {
 }

Я надеюсь, что смогу помочь.

Приветствия

...