.net 5.0 记录接口请求及返回内容

1、在Startup.cs文件中添加

 app.UseRouting();
//启用日志中间件  记录接口请求及返回结果
app.UseMiddleware<LogMiddleware>();

 

2、增加LogMiddleware文件

 public class LogMiddleware
    {
        private readonly RequestDelegate _next;
        //private SystemOperationLogRepository _systemOperationLogRepository;
        //private ILogger<LogMiddleware> _logger;

        public LogMiddleware(RequestDelegate next){
            
            _next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            httpContext.Request.EnableBuffering();

            //这里会记录当前平台下所有方法上比较Log特性的操作日志
            //Endpoint endpoint = httpContext.GetEndpoint();
            //LogAttribute actionLogAttribute = endpoint?.Metadata.GetMetadata<LogAttribute>();
            //if (actionLogAttribute != null)
            //{
                HttpRequest request = httpContext.Request;
                HttpResponse response = httpContext.Response;
                var originBody = response.Body;
                using (var memoryStream = new MemoryStream())
                {
                    response.Body = memoryStream;
                    await _next.Invoke(httpContext);

                    StreamReader requestStreamReader = null;
                    StreamReader responseStreamReader = null;

                    try
                    {
                        #region 获取request请求内容

                        string requestUrl = $"{request.Path.Value}{request.QueryString.Value}";
                        string requestContent = null;

                        if (request.HasFormContentType)
                        {
                            IFormCollection fromColl = request.Form;
                            requestContent += "{";
                            foreach (var item in fromColl)
                            {
                                requestContent += $"{item.Key}:{item.Value},";
                            }
                            requestContent += requestContent.TrimEnd(',') + "}";
                        }
                        else if (request.HasJsonContentType())
                        {
                            request.Body.Seek(0, SeekOrigin.Begin);
                            requestStreamReader = new StreamReader(request.Body);
                            requestContent = await requestStreamReader.ReadToEndAsync();

                        }

                        LogEvent.Info($"接口请求Url为:{requestUrl}接口请求的参数为:{requestContent}");

                        #endregion

                        #region 获取response结果

                        //ResponseResult responseJsonModel = null;
                        memoryStream.Seek(0, SeekOrigin.Begin);
                        responseStreamReader = new StreamReader(memoryStream);
                        string responseBody = await responseStreamReader.ReadToEndAsync();

                        LogEvent.Info($"接口返回内容为:{responseBody}");

                        #endregion


                    }
                    catch (Exception e)
                    {
                        LogEvent.Error($"日志中间件出现异常,请及时处理:{e.Message}", e);
                    }
                    finally
                    {
                        #region 还原response流内容 && 释放资源

                        memoryStream.Seek(0, SeekOrigin.Begin);
                        await memoryStream.CopyToAsync(originBody);
                        
                        //下面两句会导致报异常 已注销
                        //response.Body = originBody;
                        //response.Body.Seek(0, SeekOrigin.Begin);

                        if (requestStreamReader != null)
                        {
                            requestStreamReader.Close();
                            requestStreamReader.Dispose();
                        }
                        request.Body.Close();
                        request.Body.Dispose();

                        #endregion
                    }
                }
            //}
            //else
            //{
            //    await _next.Invoke(httpContext);
            //}

        }
    }
View Code

 

备注:原文中有单独的日志类及LogAttribute日志分类属性,我这里没用到,所以没加。 

 

参考自:https://www.cnblogs.com/lxhbky/p/14608113.html

.net core 2.0 参考:https://www.cnblogs.com/wybin6412/p/10944077.html

posted @ 2022-01-04 14:27  狼窝窝  阅读(168)  评论(0)    收藏  举报