web-dev-qa-db-fra.com

Données de publication JSON brutes en lecture ASP.NET MVC

Ça me rend fou. J'utilise ASP.NET MVC. J'ai un contrôleur avec une action HttpPost qui agit comme une URL de rappel appelée par un autre serveur (pas sous mon contrôle). Je souhaite lire de manière dynamique les fichiers JSON publiés sans utiliser WebAPI ni la liaison de modèle. L'URL est également dotée d'un paramètre de chaîne de requête.

L'URL de rappel ressemble à ceci: 

http://domain.com/callback?secret=1234

J'ai essayé de lire l'entrée publiée en utilisant:

[HttpPost]
public ActionResult Callback( String secret )
{
    String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();

    // ...
}

Cependant, "jsonData" est toujours nul ou vide.

Je veux juste obtenir l'entrée publiée et la coller dans JsonFx afin de pouvoir accéder dynamiquement au contenu. Des idées sur la façon la plus simple de procéder?

METTRE À JOUR

J'ai découvert ce qui suit ...

Tandis que ce qui précède NE FONCTIONNE PAS (jsonData sera nul ou vide), ce qui suit NE FAIT que si je configure le peu d’options que j’ai sur le serveur appelant de manière à omettre le paramètre de chaîne de requête "secret", ce qui est pratiquement tout ce que je peux faire cette fin puisque ce n'est pas mon serveur. Dans ce cas, jsonData aura la chaîne JSON publiée correcte:

[HttpPost]
public ActionResult Callback( /* String secret */ )
{
    String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();

    // ...
}

C'est très frustrant de travailler autour de moi et je ne connais pas de moyen facile d'accepter à la fois une chaîne de requête et des données JSON publiées sur un contrôleur MVC standard.

J'ai un "contrôleur de rappel" avec des méthodes Action qui acceptent diverses données (via GET, via formulaire POST, via JSON POST, via JSON POST avec une chaîne de requête, etc.) provenant de différents serveurs tiers. Ce sont des rappels de type marchand où je n’ai aucun contrôle sur les formats ou les méthodes utilisés pour transmettre des informations. Je dois juste accepter les rappels et traiter les informations qui devraient y figurer.

Tout cela fonctionne correctement dans mon contrôleur, sauf le cas de "JSON POST avec une chaîne de requête".

Cela semble (du moins pour moi) être un inconvénient des contrôleurs ASP.NET MVC standard. ???

Quelqu'un peut-il suggérer une solution pouvant être utilisée dans un contrôleur ASP.NET MVC standard?

29
lantram

Votre approche initiale devrait fonctionner si vous prenez en compte le fait que la liaison de modèle ASP.NET MVC a déjà lu le flux. Vous devez donc le rembobiner:

[HttpPost]
public ActionResult Callback(string secret)
{
    Request.InputStream.Seek(0, SeekOrigin.Begin);
    string jsonData = new StreamReader(Request.InputStream).ReadToEnd();

    // ...
}
55
tpeczek

Réinitialisez position à Zero avant de lire le flux .Request.InputStream.Position = 0

0
Abhishek7997

Pour ASP.NET Core 2, cela fonctionne pour moi.

    [HttpPost]
    public ActionResult RawTest() {
        using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
        {  
            string content = reader.ReadToEndAsync().Result;
            //...
        }
        //...
    }
0
guogangj