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?
Dans votre WebApiConfig.cs
ajouter ceci à l'intérieur du registre
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
"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.
Plusieurs problèmes:
application/octet-stream
, Utilisez plutôt application/json;charset=UTF-8
.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.
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à.
Envoyez vos données au format JSON: { Title: "some title", Desc: "some description" }
Faites quelque chose avec advertisement
dans votre fonction Post()
:
string title = advertisement.Title; string desc = advertisement.Desc;