web-dev-qa-db-fra.com

Aucun MediaTypeFormatter n'est disponible pour lire un objet de type 'Publicité' dans l'api web asp.net

J'ai une classe dont le nom est Publicité:

 public class Advertisement
{
    public string Title { get; set; }
    public string Desc { get; set; }
}

et dans mon contrôleur:

public class OrderController : ApiController
{
    public UserManager<IdentityUser> UserManager { get; private set; }

    // Post api/Order/Test

    [Route("Test")]
    public IHttpActionResult Test(Advertisement advertisement)
    {
        var currentUser = User.Identity.GetUserId();
        Task<IdentityUser> user = UserManager.FindByIdAsync(currentUser);

      return Ok(User.Identity.GetUserId());
    }

mais quand je le teste avec Postman, je fais face à cette erreur,

 "Message": "The request contains an entity body but no Content-Type header. The inferred media type 'application/octet-stream' is not supported for this resource.",
"ExceptionMessage": "No MediaTypeFormatter is available to read an object of type 'Advertisement' from content with media type 'application/octet-stream'.",
"ExceptionType": "System.Net.Http.UnsupportedMediaTypeException",
"StackTrace": "   at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"

AnyBody peut-il m'aider?

17
Mehran Ahmadi

Dans votre WebApiConfig.cs ajouter ceci à l'intérieur du registre

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
34
Louie Almeda

"ExceptionMessage": "Aucun MediaTypeFormatter n'est disponible pour lire un objet de type 'Publicité' à partir d'un contenu de type de média 'application/octet-stream'.",

Cela signifie que votre application ne peut pas lire le type de contenu en flux d'octets - ce qui est fourni par la demande. C'est une frustration que j'ai avec l'API Web. Cependant, il existe un moyen de le contourner. Le moyen le plus simple consiste à modifier le type de contenu en "application/json" ou "application/xml" qui est facilement lisible. Le plus difficile est de fournir votre propre MediaTypeFormatter.

4
Dave Agaba

Plusieurs problèmes:

  1. Au lieu de le publier sous application/octet-stream, Utilisez plutôt application/json;charset=UTF-8.
  2. public IHttpActionResult Test(Advertisement advertisement) doit contenir [FromBody]:

    public IHttpActionResult Test([FromBody]Advertisement advertisement) { ... }

    Par défaut, l'ApiController s'attend à ce que tout ce qui est transmis représente les paramètres d'URL, vous aurez donc besoin de ce [FromBody] Pour toutes les données que vous publiez dans le corps de la demande que vous souhaitez analyser.

  3. Vous devez décorer votre méthode Post avec [System.Web.Http.HttpPost] Afin qu'il ne pense pas que ce soit la version MVC [System.Web.Mvc.HttpPost]. Assurez-vous de mettre l'intégralité du contenu, car [HttpPost] Sera également défini par défaut sur la version MVC. Ce n'est probablement pas une mauvaise idée de renommer Test en Post, bien que vous l'utilisiez peut-être pour une méthode de test unitaire, donc vous n'êtes pas sûr de celle-là.

  4. Envoyez vos données au format JSON: { Title: "some title", Desc: "some description" }

  5. Faites quelque chose avec advertisement dans votre fonction Post():

    string title = advertisement.Title; string desc = advertisement.Desc;

2
vapcguy