如何打印Flurl Post请求的请求内容?
如何打印Flurl Post请求的请求内容?
我太懂你这种想验证请求内容对不对的心情了!你碰到的"对象已释放"错误,是因为Flurl在请求发送完成后,默认会自动释放请求内容来节省资源,这时候你再去response.RequestMessage.Content里读就肯定报错啦。给你几个实用的解决办法:
方法一:请求发送前提前捕获(最推荐的调试方式)
在请求发送前用Flurl的BeforeSend钩子捕获内容,这时候内容还没被处理和释放,完全安全:
string requestContent = string.Empty; var response = await _flurlClient.Request(url) .BeforeSend(call => { // 在这里提前读取请求内容 requestContent = call.Request.Content.ReadAsStringAsync().Result; }) .PostJsonAsync(content); // 现在放心打印就行啦 Console.WriteLine("请求内容:"); Console.WriteLine(requestContent);
方法二:用Flurl内置日志自动记录
如果只是调试阶段想快速看请求详情,直接开Flurl的内置日志更省心,它会自动帮你把请求头、内容这些都打出来:
// 全局配置一次就行 FlurlHttp.Configure(settings => { settings.LogLevel = LogLevel.Debug; // 用内置的控制台日志器,也可以换成你项目里用的日志框架实现 settings.Logger = new SimpleConsoleLogger(); });
配置完之后,每次发请求控制台都会输出完整的请求信息,不用自己写读取逻辑。
方法三:让Flurl保留请求内容(适合必须从响应回溯的场景)
如果你一定要从返回的response对象里读取请求内容,可以让Flurl不要自动释放它,通过设置PreserveHttpContent来实现:
var response = await _flurlClient.Request(url) .WithSettings(settings => settings.PreserveHttpContent = true) .PostJsonAsync(content); // 现在就能安全读取了 var requestContent = await response.RequestMessage.Content.ReadAsStringAsync(); Console.WriteLine(requestContent);
⚠️ 注意:这个设置会让请求内容一直留在内存里,调试完成后记得关掉,避免不必要的资源占用。
为啥你原来的代码会报错?再啰嗦一句:默认情况下,Flurl发送完请求就会把HttpContent对象Dispose掉,所以response.RequestMessage.Content已经是被释放的状态了,自然读不了~
备注:内容来源于stack exchange,提问作者user2399378




