web-dev-qa-db-fra.com

Pourquoi mon contrôleur API Web ASP.Net Core ne renvoie-t-il pas le code XML?

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.

 Postman screen shot

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é:

  • Rendre la méthode d'action synchrone et asynchrone
  • Renvoyer les données directement et définir le type de retour sur IEnumerable<CustomerDto>
  • Conversion de la collection en tableau plutôt qu'en liste
  • Retourner une IActionResult
  • Renvoyer un seul article au lieu d'une collection
  • J'ai vérifié que l'en-tête Accept apparaît dans la demande en l'examinant dans le débogueur.
  • Beaucoup de "googler avec Bing" et la lecture de divers blogs
  • 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 ...

10
Tim Long

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();
15
Kiran Challa

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.

6
Roolingen

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

5
arslanaybars

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()
        .AddXmlDataContractSeria‌​lizerFormatters();
}

Vous pouvez maintenant définir l'en-tête Accepter:

XML: application/xml

JSON: application/json

2
darkend

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 .

0
shana