使用 HttpClient,我如何查看请求的内容主体?

7

为了调试目的,我想查看我的HTTP请求包含的请求主体。这是我目前拥有的:

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

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

这会抛出一个ObjectDisposedException异常。我该如何查看请求正文以确保发送的JSON正确无误?


5
使用 fiddler ...? - rene
1
@rene - 我知道我可以使用 Fiddler 或 Wireshark 或其他许多工具,但这不是一个一次性的好奇问题。我可能想要记录请求正文以进行审计,因此我需要编程确定请求正文。 - Justin Helgerson
@JustinHelgerson 然后使用FiddlerCore :) - L.B
虽然我很感激有多种选择(我以前从未听说过FiddlerCore),但我更愿意使用在普通的.NET框架中可用的东西。有志者事竟成?也许? :) - Justin Helgerson
可能有效的唯一方法是在您的app.config中设置一个System.Net.Http tracesource,但您最终可能只会得到内容的前1024个字符。 - rene
以下扩展可以帮助您以curl脚本的形式获取HttpClient。 Nuget包 - undefined
3个回答

5
短暂的回答是请求已经发送后无法再获取。 HttpClient在请求完成后方便开发人员释放内容主体。有关详细信息,请参见为什么HttpClient.PostAsync和PutAsync会处理内容?
作为替代方案,您可以从现有的HttpContent实现中继承,重写Dispose方法,并在处理之前记录内容主体。
或者,如建议的那样,使用外部工具监视正在进行的请求。

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);

-1

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

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

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

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

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

我将在很久以后才处理 HttpClient 的释放。很明显,PostAsync 自动以某种方式处理了 HttpRequestMessage 的释放,这就是我问问题的原因。另外,如果您看一下我的问题,我已经在等待 ReadAsStringAsync 方法的执行完成再继续进行。 - Justin Helgerson
1
试一下这个,然后告诉我结果:httpResponseMessage.EnsureSuccessStatusCode();如果HTTP响应的IsSuccessStatusCode属性为false,它将抛出异常。 - Diogo Menezes
另外你可以发送 JSON 字符串来进行测试。....PostAsync(uri, new StringContent(data)); - Diogo Menezes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接