.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); //} } }
备注:原文中有单独的日志类及LogAttribute日志分类属性,我这里没用到,所以没加。
参考自:https://www.cnblogs.com/lxhbky/p/14608113.html
.net core 2.0 参考:https://www.cnblogs.com/wybin6412/p/10944077.html

浙公网安备 33010602011771号