2016-06-29 12 views
0

Jede Möglichkeit zum Abrufen der POST Request Body des Http-Client in C#? Ich möchte nur mein UT einchecken, wenn meine Erweiterungsmethode es richtig zur Anfrage hinzufügt oder nicht. Diese Funktion wird ihr nicht gerecht.Abrufen POST Request Body des HTTP-Client in C#

public static async Task<string> AddPostRequestBody<T>(this HttpClient httpclient, string RequestUrl, T classobject) 
    { 
     string json_body = Newtonsoft.Json.JsonConvert.SerializeObject(classobject); 
     HttpRequestMessage RequestMessage = new HttpRequestMessage(HttpMethod.Post, RequestUrl); 
     HttpResponseMessage response = await httpclient.PostAsync(RequestUrl, new StringContent(json_body)); 
     response = httpclient.SendAsync(RequestMessage).Result; 
     string outputresult = await response.RequestMessage.Content.ReadAsStringAsync(); 
     return outputresult; 
    } 

Bitte helfen!

+1

Überprüfen Sie einfach die ausgehende Anfrage mit Fiddler? – CodeCaster

+0

Oder verwenden Sie die Registerkarte _Network_ in Ihren Browser-Web-Tools? –

+0

Ich schreibe ein UT für meine Erweiterungsmethode, also brauche ich eine Möglichkeit, den Körper im Code zu erhalten. – Raven21

Antwort

3

Versuchen Sie es mit einem DelegatingHandler (den ich bei der Implementierung von HMAC verwendet habe, um den Inhalt zu hashen und die erforderlichen Autorisierungsheader hinzuzufügen), damit Sie auf den Inhalt zugreifen können.

CustomDelegatingHandler customDelegatingHandler = new CustomDelegatingHandler(); 
HttpClient client = HttpClientFactory.Create(customDelegatingHandler); 

public class CustomDelegatingHandler : DelegatingHandler 
{ 
    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request.Content != null) 
     { 
      byte[] content = await request.Content.ReadAsByteArrayAsync(); 
      // Do what you need with the content here 
     } 

     response = await base.SendAsync(request, cancellationToken); 
     return response; 
    } 
} 
+0

Das ist in Ordnung, dass Sie sich entschieden haben, Ihr Problem anders zu lösen, aber ich habe zumindest Ihre ursprüngliche Frage beantwortet, auch wenn Ihre Frage sich selbst geändert hat. –

0

Okay, so habe ich es mit dieser Arbeit statt eine Antwort zu schaffen, ich direkt auf die Anforderungsnachricht am anhängen und daraus abrufen. Einfach, aber zunächst in der Posted-Frage, machte ich es kompliziert, indem Sie die JSON-String zur Antwort hinzufügen.

public static string AddPostRequestBody<T>(this HttpClient httpclient, string requestUrl, T classObject) 
    { 
     string jsonBody = Newtonsoft.Json.JsonConvert.SerializeObject(classObject); 
     HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, requestUrl); 
     requestMessage.Content = new StringContent(jsonBody); 
     string requestBody = requestMessage.Content.ReadAsStringAsync().Result; 
     return requestBody;   
    }