使用HttpClient如何查看请求内容体?

时间:2016-08-25 18:01:40

标签: c# .net http

我想查看我的HTTP请求的请求主体是否包含在调试目的中。这就是我现在所拥有的:

var httpResponseMessage = await _httpClient.PostAsync(uri, objectToInsert, jsonFormatter);

//This throws an exception
var thisDoesntWork = await httpResponseMessage.RequestMessage.Content.ReadAsStringAsync();

这会引发ObjectDisposedException。如何查看请求正文以确保发送的JSON是否正确?

3 个答案:

答案 0 :(得分:2)

简短的回答是您已经发送请求后不能。 HttpClient在发出请求后处理内容主体,以方便开发人员。有关详细信息,请参阅Why do HttpClient.PostAsync and PutAsync dispose the content?

作为替代方案,您可以从现有的HttpContent实现继承,覆盖Dispose方法,并在处理之前记录内容的主体。

或者,如建议的那样,使用外部工具来监控飞行中的请求。

答案 1 :(得分:0)

您需要首先创建一个 HttpRequestMessage 以传递给 HttpClient。然后您就可以评估/记录内容。

    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, uri);
    request.Content=JsonSerializer.Serialize(objectToInsert);
    Console.WriteLine(request.Content.ReadAsStringAsync().Result);
    HttpResponseMessage response = await httpClient.SendAsync(request);

答案 2 :(得分:-2)

抛出ObjectDisposedException,因为您在Content.ReadAsStringAsync()完成之前处理了HttpRequestMessage和HttpClient。

请注意,Content.ReadAsStringAsync()是一种异步方法。在处理HttpClient之前,您需要等待它完成。

如果您不想使用异步,可以添加.Result以强制代码同步执行:

var response = httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)).Result;

var contents = response.Content.ReadAsStringAsync().Result;