J'ai ajouté une sortie formatée et une entrée formatée pour xml pour ma solution API

//add formatter to support XML media type results(application/xml)
setupAction.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
//add formatter to support XML media type request(application/xml)
setupAction.InputFormatters.Add(new XmlDataContractSerializerInputFormatter());

Mais quand je fais une demande en utilisant un en-tête d'acceptation de application / xml j'obtiens un 406 est-ce que quelqu'un d'autre a rencontré ceci?

Le type de contenu est application / json

---- FIXE ----

Si l'objet renvoyé par l'action du contrôleur a un constructeur et que l'en-tête d'acceptation est application / xml, la réponse sera un 406. Il suffit de supprimer le constructeur et je pourrais retourner XML.

6
Hizzy 27 nov. 2017 à 21:49

3 réponses

Meilleure réponse

Ré. "Si l'objet renvoyé par l'action du contrôleur a un constructeur et que l'en-tête d'acceptation est application / xml, la réponse sera un 406." En fait, ce n'est pas correct. Correction: "Si l'objet renvoyé par l'action du contrôleur a un constructeur qui prend des arguments, et que l'objet n'a pas non plus de constructeur à argument 0, et que l'en-tête d'acceptation est application / xml, la réponse sera un 406. "

4
Ken 4 déc. 2018 à 17:01
Actually, I had the same problem, In my case I have a relationship in my tables, so, Entity Framework create a IEnumerable<Class> when you have HasMany, so what I did was just change my code 
from:
public ICollection<Credential> Credential { get; set; }

to:
public List<Credential> Credential { get; set; }

and Constructor from:
        public Personal()
        {
            Credential = new HashSet<Credential>();
        }
to:
        public Personal()
        {
            Credential = new List<Credential>();
        }
0
Alan Uscanga 13 janv. 2020 à 19:04

J'ai eu le même problème (.Net Core 2.2).

En raison de la remarque sur cette page: https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-2.2

J'ai vérifié que mon contrôleur hérite de Controller et que ma méthode retournait IActionResult. C'était le cas.

Au début, j'ai ajouté ce formateur de sortie:

  setupAction.OutputFormatters.Add(new XmlSerializerOutputFormatter());

Cela ne fonctionnait pas même si les formateurs étaient dans la liste des formateurs de sortie et avec le bon MediaType.

Ensuite, j'ai changé pour utiliser la méthode .Net 2.2 préférée:

        services.AddMvc(setupAction => 
        { 
               ...
        })
        .AddXmlSerializerFormatters();

Toujours pas de succès.

Je suis retourné à "l'ancienne" manière et j'ai supprimé AddXmlSerializerFormatters () et ajouté

 setupAction.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());

C'est à dire. Utilisation de XmlDataContractSerializerOutputFormatter au lieu de XmlSerializerOutputFormatter.

Et puis ça a marché.

Je passe un certain temps à comprendre les différences et je suppose que XmlSerializerOutputFormatter peut écrire le type d'objet qui est IEnumerable et que Customer est un POCO sans constructeur.

C'est ce qui est dans le journal à l'aide de XmlSerializerOutputFormatter Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector: Avertissement: Aucun formateur de sortie n'a été trouvé pour le type de contenu 'application / xml' pour écrire la réponse. Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor: Avertissement: aucun formateur de sortie n'a été trouvé pour le type de contenu 'application / xml' pour écrire la réponse.

1
P Schalkwijk 6 août 2019 à 09:37
47517840