2016-08-29 3 views
2

Я не могу получить голые кости Проект Asp.Net Core Web Api для работы с использованием Xml вместо Json. Пожалуйста помоги!Xml Запросы не работают

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

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddApplicationInsightsTelemetry(Configuration); 

    services.AddMvc(config => 
    { 
     config.InputFormatters.Add(new XmlSerializerInputFormatter()); 
     config.OutputFormatters.Add(new XmlSerializerOutputFormatter()); 
    }); 
} 

My Controller также содержит простые Get и методы Post:

[Route("api")] 
public class MessageController : Controller 
{ 
    [HttpPost] 
    public void Post([FromBody] Message message) 
    { 

    } 

    [HttpGet] 
    public IActionResult Get() 
    { 
     return Ok(new Message 
     { 
      TestProperty = "Test value" 
     }); 
    } 
} 

Когда я пытаюсь вызвать метод POST с помощью Content-Type: application/xml, API возвращает 415 Unsupported Media Type. Я попытался добавить атрибут Consumes("application/xml") к контроллеру, но он все равно не работает.

GET работает и возвращает JSON. Однако, если я добавлю атрибут Produces("application/xml") к контроллеру, GET возвращает 406 Not Acceptable, даже если я предоставляю заголовок Accepts: application/xml.

По какой-то причине API полностью отвергает все, что связано с xml, хотя добавлены форматы ввода и вывода, как я видел в очень немногих примерах, которые я мог найти.

Что мне не хватает?

+0

Если это не работает с XML по умолчанию, без необходимости добавлять что-либо? – Mfusiki

+0

Нет, по умолчанию ядро ​​Asp.Net включает только Json Formatters. Должны быть явно добавлены Xml Formatters. За исключением того, что они не работают, очевидно ... – frangelico87

+0

@ frangelico87 Вы пытались установить 'config.RespectBrowserAcceptHeader = true;'. Согласно этой статье (https://wildermuth.com/2016/03/16/Content_Negotiation_in_ASP_NET_Core) это необходимо. –

ответ

3

У меня есть следующая вещь в моем startup.cs, и она отлично работает с XML и JSON. Здесь я придерживаюсь только XML. Примечание: (У меня есть рассмотреть мой собственный класс для образца)

  1. Startup.cs

    public void ConfigureServices(IServiceCollection services) 
        { 
         services.AddMvcCore() 
           .AddJsonFormatters().AddXmlSerializerFormatters(); 
        } 
    
  2. Мой HttpClient Код (Вы, возможно, пропустили Содержание параметров типа, которые я делал в StringCotent)

    • Важно иметь два заголовка: Принять и Тип содержимого. Принять помощь в согласовании контента и Content-Type - это указать клиентскому серверу, какой клиент контента контента будет размещать.

      HttpClient client = new HttpClient(); 
      client.BaseAddress = new Uri(@"http://localhost:5000"); 
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml")); 
      
      
      HttpContent content = new StringContent(@"<Product> 
      <Id>122</Id> 
      <Name>Computer112</Name></Product>",System.Text.Encoding.UTF8 , "application/xml"); // This is important. 
      
      var result = client.PostAsync("/api/Products", content).Result; 
      
+0

+1 Хороший ответ, но я думаю, что для POST важно иметь значение «Content-Type: application/xml», потому что возвращаемое значение «void». «Accept: application/xml» может быть важным для GET.Более того, можно использовать 'AddXmlDataContractSerializerFormatters' вместо' AddXmlSerializerFormatters', потому что он поддерживает больше типов данных (например, 'Словарь'). – Oleg

Смежные вопросы