You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何打印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

火山引擎 最新活动