2013-07-31 21 views
38

Ich habe einen MVC-API-Controller mit der folgenden Aktion.So erhalten Sie HttpRequestMessage-Daten

Ich verstehe nicht, wie man den tatsächlichen Daten/Körper der Nachricht liest?

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

Was bekommen Sie von 'request.Content'? – Mansfield

+0

Ich sehe alle Header und die Länge des Inhalts, aber wo sind die Daten? – user1615362

Antwort

60

Von this answer:

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

Aus der Sicht des Entwicklers ist die Verwendung von aync möglicherweise keine bessere Option, wenn Sie debuggen oder warten möchten, bis die Operation zum Anzeigen der Daten abgeschlossen ist. – Kurkula

+5

52 upvotes für eine potentiell Deadlock-verursachende Lösung bedeutet wahrscheinlich, dass es eine Menge asynchroner Codes gibt. Verwenden Sie in diesem Szenario immer async/await. –

+0

Leute, lesen Sie bitte @ ToddMeniers Kommentar: Verwenden Sie diesen Code NICHT in der Produktion. Es ist in unserem Code erschienen und hat sich festgefahren. – makhdumi

12

Ich schlage vor, dass Sie es so nicht tun sollten. Die Aktionsmethoden sollten so konzipiert sein, dass sie problemlos in der Einheit getestet werden können. In diesem Fall sollten Sie nicht direkt auf Daten von der Anfrage zugreifen, denn wenn Sie es so machen, müssen Sie, wenn Sie diesen Code testen wollen, eine HttpRequestMessage erstellen.

Sie sollten es so machen MVC für Sie alle Modell verbindlich machen lassen:

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

} 

Falls Sie wollen die Anforderung zuzugreifen. Sie greifen einfach auf die Request-Eigenschaft des Controllers zu (nicht über Parameter). Wie folgt aus:

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

In MVC, ist die Anfrage Eigenschaft tatsächlich ein Wrapper um .NET Httprequest und von einer Basisklasse erben. Wenn Sie einen Komponententest durchführen müssen, können Sie auch dieses Objekt vortäuschen.

+0

Und falls Sie HttpGet haben? Wenn ich Request.Content.ReadAsStringAsync() verwende. es funktioniert nicht! – ayasha

+0

@ayasha: mit HttpGet, sollten die Parameter von Query String statt Anfrage Körper kommen. –

+0

@ayasha: Ich habe auch die Antwort aktualisiert. Habe gerade gemerkt, dass es nicht funktioniert hat –

16
System.IO.StreamReader reader = new System.IO.StreamReader(HttpContext.Current.Request.InputStream); 
    reader.BaseStream.Position = 0; 
    string requestFromPost = reader.ReadToEnd(); 
+5

Das funktioniert für mich, während die angenommene Antwort nicht funktioniert. – Jerther

+0

Request.Content ist ein Stream. Abhängig davon, wann genau Ihr Code ausgeführt wurde, wurde der Stream möglicherweise bereits verbraucht. – stannius

+0

Dies funktioniert für MVC, während angenommene Antwort für Web-API nur – Sel