web-dev-qa-db-fra.com

Accepter x-www-form-urlencodé dans l'API Web .Net Core

J'ai une API Web .Net Core qui renvoie une erreur de support non pris en charge 415 lorsque j'essaie de lui envoyer des données comprenant du json. Voici une partie de ce qui est renvoyé dans le débogueur Chrome:

Request URL:http://localhost:51608/api/trackAllInOne/set
Request Method:POST
Status Code:415 Unsupported Media Type
Accept:text/javascript, text/html, application/xml, text/xml, */*
Content-Type:application/x-www-form-urlencoded

action:finish
currentSco:CSharp-SSLA:__How_It_Works_SCO
data:{"status":"incomplete","score":""}
activityId:13
studentId:1
timestamp:1519864867900

Je pense que cela a à voir avec le fait que mon contrôleur n'accepte pas les données application/x-www-form-urlencoded - mais je ne suis pas sûr. J'ai essayé de décorer mon contrôleur avec Consumes mais cela ne semble pas fonctionner.

[HttpPost]
[Route("api/trackAllInOne/set")]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult Post([FromBody] PlayerPackage playerPackage)
{ etc..}

Toute aide grandement appréciée. 

Le code suivant a très bien fonctionné dans .Net 4.6.1 et je suis capable de capturer et de traiter les publications présentées ci-dessus.

[ResponseType(typeof(PlayerPackage))]
public async Task<IHttpActionResult> PostLearningRecord(PlayerPackage playerPackage)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var id = Convert.ToInt32(playerPackage.ActivityId);
        var learningRecord = await _context.LearningRecords.FindAsync(id);
        if (learningRecord == null)
            return NotFound();
etc...
3
Roddy Balkan

Pour PlayerPackage, la demande doit envoyer un objet Json PlayerPackage, en fonction de votre description, vous ne pouvez pas contrôler la demande publiée depuis un autre emplacement. 

Pour la demande, son type est application/x-www-form-urlencoded ,, il enverra des données avec {"status": "incomplet", "score": ""}} au format Chaîne d'objet Json. Si vous souhaitez accepter {"status": "incomplet", "score": ""}, je vous suggère de modifier la méthode comme ci-dessous, puis de faire converger la chaîne en Object de Newtonsoft.Json 

    [HttpPost]
    [Route("~/api/trackAllInOne/set")]
    [Consumes("application/x-www-form-urlencoded")]
    public IActionResult Post([FromForm] string data)
    {
        PlayerPackage playerPackage = JsonConvert.DeserializeObject<PlayerPackage>(data);
        return Json(data);
    }
11
Tao Zhou

Essayez d’utiliser [FromForm] au lieu de [FromBody]

public IActionResult Post([FromForm] PlayerPackage playerPackage)

FromBody -> Si vous vous liez à partir de JSON

FromForm -> Si vous utilisez des paramètres de formulaire

NOTE 1:

Vous pouvez également supprimer [FromBody] complètement et l’essayer ensuite. Parce que vous attendez form-urlencoded, vous devez lui indiquer de se lier à object.

10
Aeseir

J'ai eu le même problème. FormDataCollection n'a aucun constructeur par défaut requis par Formatters. Utilisez IFormCollection à la place

0
jahansha