web-dev-qa-db-fra.com

Comment obtenir des données HttpRequestMessage

J'ai un contrôleur API MVC avec l'action suivante. 

Je ne comprends pas comment lire les données/le corps du message?

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
}
47
user1615362

De cette réponse :

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
    string jsonContent = content.ReadAsStringAsync().Result;
}

Remarque: Comme indiqué dans les commentaires, ce code pourrait provoquer un blocage et ne doit pas être utilisé. Voir cet article de blog pour plus de détails.

69
Mansfield
  System.IO.StreamReader reader = new System.IO.StreamReader(HttpContext.Current.Request.InputStream);
  reader.BaseStream.Position = 0;
  string requestFromPost = reader.ReadToEnd();
21
Zebing Lin

Je suggère que vous ne devriez pas le faire comme ceci . Les méthodes d'action devraient être conçues pour être facilement testées à l'unité. Dans ce cas, vous ne devriez pas accéder aux données directement à partir de la demande, car si vous le faites comme ceci, lorsque vous voulez tester ce code à l'unité, vous devez créer un HttpRequestMessage.

Vous devriez le faire comme ceci pour laisser MVC faire toute la reliure de modèle pour vous:

[HttpPost]
public void Confirmation(YOURDTO yourobj)//assume that you define YOURDTO elsewhere
{
        //your logic to process input parameters.

}

Dans le cas où vous voulez pour accéder à la requête. Vous accédez simplement à la propriété Request du contrôleur (et non à l'aide de paramètres). Comme ça:

[HttpPost]
public void Confirmation()
{
    var content = Request.Content.ReadAsStringAsync().Result;
}

Dans MVC, la propriété Request est en réalité une enveloppe autour de .NET HttpRequest et hérite d'une classe de base. Lorsque vous avez besoin d'un test unitaire, vous pouvez également vous moquer de cet objet.

12
Khanh TO

Au cas où vous souhaiteriez lancer un casting sur une classe et pas seulement sur une chaîne:

YourClass model = await request.Content.ReadAsAsync<YourClass>();
0
codeMonkey