asp.net MVC 3 - lecture de la charge utile POST dans la méthode du contrôleur paramétré

j'avais

[HttpPost]        
public ActionResult Foo()
{
   //read HTTP payload
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
 ....
}

La charge utile est application/json; a bien fonctionné; alors j'ai changé pour

public ActionResult Foo(string thing)
{
....
}

L'intention étant de publier sur MyController/Foo? Thing = yo Maintenant, je ne peux pas lire la charge utile (la longueur est correcte mais le flux est vide). Je suppose que la plomberie du contrôleur a mangé la charge utile à la recherche de données de poste de formulaire qui peuvent être mappés aux paramètres de la méthode. Est-il possible que je puisse arrêter ce comportement (MVC ne devrait sûrement pas avoir mangé une charge utile dont le type est marqué comme JSON, il devrait seulement regarder les données de formulaire). Mon travail consiste à ajouter 'chose' au json mais je n'aime pas vraiment ça

0

1 Réponses

Essayez de réinitialiser la position du flux d'entrée avant de lire:

public ActionResult Foo(string thing)
{
    Request.InputStream.Position = 0;
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
    ....
}

Cela étant dit, si vous envoyez une charge utile application/json pourquoi sur la Terre sainte vous prenez la peine de lire directement le flux de requêtes au lieu de simplement définir et utiliser un modèle de vue:

public class MyViewModel
{
    public string Thing { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
    ...
}

et alors:

public ActionResult Foo(MyViewModel model)
{
   //use the model here 
    ....
}

ASP.NET MVC 3 dispose d'un JsonValueProviderFactory intégré qui vous permet de lier automatiquement les requêtes JSON aux modèles. Et si vous utilisez une version plus ancienne, il est trivialement facile d'ajouter une telle usine comme l'illustre Phil Haack dans son article de blog .

0
ajouté
En ce qui concerne votre "pourquoi diable, ...", dans mon cas il n'y a pas de vues ou de modèles. Mes appels sont tous des appels AJAX purs. J'utilise simplement la partie C de MVC comme un cadre sympa pour le côté serveur 'REST'. De plus, le support de microsoft json n'est pas bon pour les types complexes, j'utilise plutôt json.net
ajouté l'auteur pm100, source
Request.InputStream.Position = 0; est une réponse valide.
ajouté l'auteur Max Favilli, source