如何读取 IHttpLoggingInterceptor.OnResponseAsync 中的响应正文?

问题描述 投票:0回答:1

用于自定义内置http 记录器的日志记录。

当我尝试通过

HttpLoggingInterceptorContext.HttpContext.Response.Body
读取
StreamReader
时,它只是返回空字符串。

当我尝试将该代码移入

HttpLoggingInterceptorContext.HttpContext.Response.OnStarting
时,它仍然是一个空字符串。

内部

HttpLoggingInterceptorContext.HttpContext.Response.OnCompleted
HttpContext 已无法从
HttpLoggingInterceptorContext.HttpContext

使用

我试图使用此代码来读取正文本身。在尝试将该中间件代码应用于此拦截器代码时尝试进行多个小更改,但它仍然不起作用。我该怎么做?

以前我试图简单地实现自定义中间件以用于日志记录目的。我也陷入了尝试阅读响应正文的阶段。然而,在我的自定义代码中,我在尝试通过阅读器从正文读取流的那一行得到了

System.InvalidOperationException: The response headers cannot be modified because the response has already started.
。即使我只是在阅读回复,它仍然发生,我没有尝试以任何可能的方式修改它。而且它并不是每次都可以重现。仅当同时处理多个异步请求时。一件接一件地工作得非常完美。我发现了这个讨论

他们在讨论中提到这个 bug 是从 .NET 7 引入的。因此我们尝试更新到 .NET 8,希望能解决问题,但没有。

所以最终我发现内置记录器也有一种通过代码自定义它的方法,而不仅仅是选项选择记录什么和忽略什么。所以我尝试了。好消息 - 它在尝试读取正文时不会给出例外。坏消息 - 它总是返回空字符串。

我想这要么是仍然可以做的事情,要么只是微软需要修复的一个错误。那么到底是哪一个呢?

c# logging stream .net-8.0
1个回答
0
投票

不确定您试图通过阅读响应正文来完成什么,但我在搜索相同的解决方案时发现了这个问题。

最终我希望应用程序生成 transaction_id,以及一些其他属性作为响应正文的一部分进行记录,因为它们比开箱即用的详细信息更重要/重要。

我没有做任何阅读响应正文的工作...所以经过大量研究,我找到了 HttpContext.Items 属性,并有了一个对我来说非常有效的想法:

在我的 WebAPI 控制器中:

HttpContext.Items.Add("transaction_id", transaction_id ?? "InvalidTxID");
HttpContext.Items.Add("ImportantVal1", ImportantVal1);
HttpContext.Items.Add("ImportantVal2", ImportantVal2);
etc...

在我的 IHttpLoggingInterceptor 实现中:

logContext.HttpContext.Items.TryGetValue("transaction_id", out var txid);
logContext.AddParameter("transaction_id", txid ?? "InvalidTxID");

这对我来说非常有效,并为我的应用程序生成有用的日志。

我最近发现的一个警告是,当发生某些异常时,可能不会记录此信息。例如,来自调用应用程序的请求非常慢,因此该请求从未完全收到 - 因此永远不会点击我的控制器。这是生成的异常:

Microsoft.AspNetCore.Server.Kestrel[13] Connection id \"0HN2P1BKI6978\", Request id \"0HN2P1BKI6978:00000001\": An unhandled exception was thrown by the application. Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Reading the request body timed out due to data arriving too slowly. See MinRequestBodyDataRate

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.