如何使用 Flurl v3.0.0 自动记录响应

How to automatically log responses using Flurl v3.0.0

我在集成测试中使用 Flurl 并尝试配置客户端以记录响应(使用 Flurl.Http 3.0.0)。

我正在使用 event handlers 以字符串形式读取响应,然后记录它。 但是,如果调用代码在启用日志记录时使用 IFlurlResponse.GetJsonAsync<>,则反序列化对象为 null(我想是因为流已被读取)。

我认为这可能是可能的,因为我可以看到 Flurl 在内部跟踪是否已读取响应流(使用 _streamRead_capturedBody 成员)。

这是一个重现,使用 Flurl.Http 3.0.0:

   class Program
    {
        static async Task Main(string[] args)
        {
            using (var client = new FlurlClient("https://jsonplaceholder.typicode.com/"))
            {
                var post = await client
                            .Request("posts/1")
                            .ConfigureRequest(settings => settings.AfterCallAsync = LogResponse)
                            .GetJsonAsync<Post>();
                Console.WriteLine($"Is null with logging enabled: {post is null}"); // prints True

                post = await client.Request("posts/1").GetJsonAsync<Post>();
                Console.WriteLine($"Is null with logging disabled: {post is null}"); // prints False
            }
        }

        private static async Task LogResponse(FlurlCall call)
        {
            var responseString = await call.Response.GetStringAsync();
            Console.WriteLine(responseString);
        }
    }

    public class Post
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }

输出:

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
Is null with logging enabled: True
Is null with logging disabled: False

如果我将调用代码从使用 GetJsonAsync<> 更改为 GetStringAsync 并自己处理 json 反序列化,那么响应可能是 'read' 两次,但更冗长。

更新fix has been released.


您是对的,在大多数情况下,Flurl 会“捕获”反序列化的响应,因此可以轻松地多次读取它们。但是,正如我认为您接近得出结论,这目前仅在您反序列化为同一类型时才有效。如果事件处理程序和主要逻辑都反序列化为 string,或都反序列化为 Post,这应该可以工作。

我不确定我是否会称这是一个错误(也许?),但我绝对相信让它像您在这里期望的那样工作将是一个很好的改进,而且不会太难.请打开一个 issue,我会在未来的版本中解决这个问题。