Вернуть полный XML ответ от ASP. NET Базовый метод Web API - PullRequest
1 голос
/ 19 февраля 2020

Я подхожу к ASP. NET Ядро пользуется запросом клиента о веб-сервисе. Запрос представляет собой веб-метод, который возвращает данные в формате XML, например:

<?xml version="1.0" encoding="UTF-8"?>
<Person>
  <Name>John</Name>
  <Surname>Doe</Surname>
  . . .
</Person>

Я могу сделать так, чтобы веб-служба возвращала данные text/xml в соответствии с запросом, форсируя их в методе ConfigureServices внутри Startup.cs как показано ниже:

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

Проблема в том, что когда я вызываю метод, который должен возвращать данные, у меня нет заголовка объявления XML, требуемого клиентом по некоторым причинам:

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

Это результат:

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Name>John</Name>
    <Surname>Doe</Surname>
</Person>

Вот метод:

[HttpGet("getperson")]
public Person GetPerson()
{
    return new Person 
    {
        Name = "John",
        Surname = "Doe",
    };        
}

А вот класс Person:

public class Person
{
    public string Name { get; set; }

    public string Surname { get; set; }
}

Я провел много исследований, но все, что я нашел, не помогло мне вообще. Я хотел бы использовать функции инфраструктуры, сериализующие мои классы, вместо того, чтобы строить структуру XML узел за узлом, поэтому я надеялся на некоторые параметры внутри служб, которые позволили бы мне сделать это.

При необходимости можно внести любые изменения в метод GetPerson, это действительно очень упрощенный тест.

Заранее спасибо за помощь!

1 Ответ

2 голосов
/ 19 февраля 2020

Вам необходимо настроить XML форматер вывода следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddMvc(options =>
    {
        options.Filters.Add(new ProducesAttribute("text/xml"));
        options.OutputFormatters.Add(new XmlSerializerOutputFormatter(new XmlWriterSettings
        {
            OmitXmlDeclaration = false
        }));
    }).AddXmlSerializerFormatters();
}

Пример вывода:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <string>value1</string>
    <string>value2</string>
</ArrayOfString>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...