gpt4 book ai didi

c# - 在 ASP.Net Core 3.1 API 中记录响应正文

转载 作者:行者123 更新时间:2023-12-03 08:37:30 24 4
gpt4 key购买 nike

最近我开始为我工作的公司开发 API。经过一些研究,我们最终使用 NLog 作为日志记录库,它有一个布局渲染器用于记录发布的请求正文,所以这很好。但是,还需要记录响应,即处理和返回请求所花费的时间(因为它也会被第 3 方供应商消耗,通常它与其中一些供应商的方式是: -我单击了事情。-嗯,不,你没有)。

现在,我这些天读了很多关于中间件日志记录的文章,但有些帖子已经过时了,有些解决方案只能部分工作(查看开发人员页面时出现问题),在 github 的某个地方我读到记录日志是不好的做法响应,因为它可能包含敏感数据。也许我缺少诸如遥测之类的东西?

感谢您的时间和帮助,并对您的咆哮表示歉意,在无休止的阅读测试之后,我仍然感到很焦灼。

我已经尝试过什么以及当前的问题是什么。context.Response.Body 的问题在于它是一个不可读但可写的流。为了读取它,必须将其分配给另一个流,然后将新的可读流分配给.Body,然后允许它继续到 Controller ,读取返回的流并将其复制回.Body。

示例中间件类。 (致谢:jarz.net | logging-middleware)

    public class LoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<LoggingMiddleware> _logger;

public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger)
{
_logger = logger;
_next = next;
}

public async Task Invoke(HttpContext context)
{
if (_logger.IsEnabled(LogLevel.Trace))
{
string responseBodyString = string.Empty;

try
{
// Swap the original Response.Body stream with one we can read / seek
Stream originalResponseBody = context.Response.Body;
using MemoryStream replacementResponseBody = new MemoryStream();
context.Response.Body = replacementResponseBody;

await _next(context); // Continue processing (additional middleware, controller, etc.)

// Outbound (after the controller)
replacementResponseBody.Position = 0;

// Copy the response body to the original stream
await replacementResponseBody.CopyToAsync(originalResponseBody).ConfigureAwait(false);
context.Response.Body = originalResponseBody;

if (replacementResponseBody.CanRead)
{
replacementResponseBody.Position = 0;
responseBodyString = new StreamReader(replacementResponseBody, leaveOpen: true).ReadToEndAsync().ConfigureAwait(false).GetAwaiter().GetResult();
replacementResponseBody.Position = 0;
}
}
finally
{
if (responseBodyString.Length > 0)
{
_logger.LogTrace($"{responseBodyString}");
}
}
}
else
await _next(context);
}
}

最佳答案

这是一个向 ASP.NET Core 服务添加日志记录中间件的最小端到端示例,不会中断诸如生成开发人员异常页面之类的事情。

https://github.com/Treit/LoggingMiddlewareExample

关于c# - 在 ASP.Net Core 3.1 API 中记录响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63495482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com