J'ai le contrôleur API Web simple suivant:
// GET: api/customers
[HttpGet]
public async Task<IActionResult> Get()
{
var customers = await uow.Users.GetAllAsync();
var dto = customers.Select(p => new CustomerDto {Id = p.Id, Email = p.Email, UserName = p.UserName});
return Ok(dto); // IEnumerable<CustomerDto>
}
Dans Postman, je règle l'en-tête Accept sur application/xml
, mais quoi que j'essaye, je ne peux récupérer que des données JSON.
J'ai lu quelque part que pour obtenir du XML, je dois ajouter les attributs [DataContract]
et [DataMember]
à mon DTO, qui ressemble maintenant à ceci:
[DataContract]
public class CustomerDto
{
[DataMember]
public string Id { get; set; }
[Required]
[EmailAddress]
[Display(Name = "Email")]
[DataMember]
public string Email { get; set; }
[Required]
[Display(Name = "Login Name")]
[DataMember]
public string UserName { get; set; }
}
J'y travaille depuis plusieurs heures et je ne vois tout simplement pas pourquoi cela ne fonctionne pas. J'ai essayé:
IEnumerable<CustomerDto>
IActionResult
Créer un nouveau projet WebAPI à partir du modèle et voir s'il y a une inspiration (pas vraiment).
Je suppose que c'est simple, mais je ne le vois pas ...
Les formateurs XML font partie d'un package séparé: Microsoft.AspNetCore.Mvc.Formatters.Xml
Ajoutez le paquet ci-dessus et mettez à jour votre startup.cs comme ci-dessous:
services
.AddMvc()
.AddXmlDataContractSerializerFormatters();
OR
services
.AddMvc()
.AddXmlSerializerFormatters();
Pour Asp.Net Core 2.x, vous avez généralement besoin de ces 3 éléments pour pouvoir renvoyer une réponse XML:
Startup.cs:
services
.AddMvcCore(options => options.OutputFormatters.Add(new XmlSerializerOutputFormatter())
CustomerController.cs:
using Microsoft.AspNetCore.Mvc;
namespace WebApplication
{
[Route("api/[controller]")]
public class CustomerController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
var customer = new CustomerDto {Id = 1, Name = "John", Age = 45};
return Ok(customer);
}
}
}
CustomerDto.cs:
namespace WebApplication
{
public class CustomerDto
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}
Et après l'ajout de l'en-tête Accept "application/xml" à la demande, un résultat au format XML sera renvoyé.
Un très note importante} que j'ai dû découvrir par moi-même est que si votre modèle n'a pas de constructeur explicite sans paramètre explicite, la réponse sera écrite sous la forme d'un json. Étant donné l'exemple suivant
namespace WebApplication
{
public class CustomerDto
{
public CustomerDto(int id, string name, int age)
{
Id = id;
Name = name;
Age = age;
}
public int Id { get; }
public string Name { get; }
public int Age { get; }
}
}
Il retournerait (json} _. A ce modèle, vous devriez ajouter
public CustomerDto()
{
}
Et cela retournerait à nouveau XML.
Pour asp.net core 2.x , vous pouvez configurer OutputFormatter .
vous pouvez essayer de suivre des morceaux de code dans la méthode startupSs class ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(action =>
{
action.ReturnHttpNotAcceptable = true;
action.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
});
//...
}
Pour utiliser XmlDataContractSerializerOutputFormatter references from Microsoft.AspNetCore.Mvc.Formatters package de nuget.
maintenant cela devrait fonctionner pour xml et json
Pour MVC 1.1 vous devez ajouter le paquetage Microsoft.AspNetCore.Mvc.Formatters.Xml
et éditer votre Startup.cs :
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => { options.RespectBrowserAcceptHeader = true; })
.AddXmlSerializerFormatters()
.AddXmlDataContractSerializerFormatters();
}
Vous pouvez maintenant définir l'en-tête Accepter:
XML: application/xml
JSON: application/json
Pour les versions Core 2.x, la seule chose à faire est d’avoir le code suivant dans la méthode ConfigureServie of Startup.cs file.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddMvcOptions(o => o.OutputFormatters.Add(
new XmlDataContractSerializerOutputFormatter()));
}
Vous devez référencer le Microsoft.AspNetCore.Mvc.Formatters .