Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NETCore3.1API中的日志响应主体_C#_Asp.net Core_Middleware - Fatal编程技术网

C# ASP.NETCore3.1API中的日志响应主体

C# ASP.NETCore3.1API中的日志响应主体,c#,asp.net-core,middleware,C#,Asp.net Core,Middleware,最近我开始为我工作的公司开发API。 经过一些研究,我们最终使用NLog作为日志库,它有一个布局渲染器用于记录发布的请求主体,这很好。但是,还需要记录响应,即请求处理和返回所需的时间(因为它也会被第三方供应商消耗,通常情况下,其中一些供应商会这样做:-我点击了这个东西。-嗯,不,你没有) 现在,我已经读了很多关于中间件日志的文章,但是有些帖子已经过时,有些解决方案部分工作(查看开发者页面有问题),我在github的某个地方读到,记录响应是不好的做法,因为它可能包含敏感数据。也许我遗漏了一些类似遥

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

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

谢谢你的时间和帮助,对你的咆哮表示歉意,经过没完没了的阅读测试后,我还是很焦躁

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

示例中间件类。(贷项为:)

公共类日志中间件
{
private readonly RequestDelegate\u next;
专用只读ILogger\u记录器;
公共日志中间件(RequestDelegate next,ILogger logger)
{
_记录器=记录器;
_下一个=下一个;
}
公共异步任务调用(HttpContext上下文)
{
如果(_logger.IsEnabled(LogLevel.Trace))
{
string responseBodyString=string.Empty;
尝试
{
//将原始的Response.Body流与我们可以读取/查找的流交换
Stream originalResponseBody=context.Response.Body;
使用MemoryStream replacementResponseBody=new MemoryStream();
context.Response.Body=replacementResponseBody;
wait _next(上下文);//继续处理(附加中间件、控制器等)
//出站(控制器之后)
replacementResponseBody.Position=0;
//将响应主体复制到原始流
wait replacement responsebody.CopyToAsync(原始responsebody.configurewait(false);
context.Response.Body=originalResponseBody;
if(replacementResponseBy.CanRead)
{
replacementResponseBody.Position=0;
responseBodyString=newstreamreader(replacementResponseBody,leaveOpen:true).ReadToEndAsync().ConfigureAwait(false).GetAwaiter().GetResult();
replacementResponseBody.Position=0;
}
}
最后
{
如果(ResponseBing.Length>0)
{
_logger.LogTrace($“{responseBodyString}”);
}
}
}
其他的
等待下一步(上下文);
}
}

这里是一个最小的端到端示例,可以向ASP.NET核心服务添加日志中间件,而不会中断开发人员异常页面的生成


这里是一个最小的端到端示例,可以向ASP.NET核心服务中添加日志中间件,而不会中断开发人员异常页面的生成


您面临的问题是什么?我要求提供有关如何做到这一点的指导和最佳做法。您面临的问题是什么?我要求提供有关如何做到这一点的指导和最佳做法。您的示例对我很有用,谢谢。。。在一个大型项目中尝试了几次之后,我开始制作一个最小的示例。您的示例对我很有用,谢谢。。。在一个大型项目中尝试了几次之后,我开始制作一个最小的示例。