Asp.Net Core 3.1 每次请求记录接口访问日志
1 public class RequestResponseLoggingMiddleware 2 { 3 private readonly RequestDelegate _next; 4 private RequestResponseLog _logInfo; 5 6 public RequestResponseLoggingMiddleware(RequestDelegate next) 7 { 8 _next = next; 9 } 10 11 public async Task Invoke(HttpContext context) 12 { 13 _logInfo = new RequestResponseLog(); 14 var serviceProvider = context.RequestServices; 15 var logRepo = (IAsyncRepository<Log>)serviceProvider.GetService(typeof(IAsyncRepository<Log>)); 16 17 HttpRequest request = context.Request; 18 _logInfo.Url = request.Path.ToString(); 19 _logInfo.Headers = request.Headers.ToDictionary(k => k.Key, v => string.Join(";", v.Value.ToList())); 20 _logInfo.Method = request.Method; 21 _logInfo.ExcuteStartTime = DateTime.Now; 22 23 //获取request.Body内容 24 if (request.Method.ToLower().Equals("post")) 25 { 26 27 HttpRequestRewindExtensions.EnableBuffering(request); //启用倒带功能,就可以让 Request.Body 可以再次读取 28 29 Stream stream = request.Body; 30 request.Body.Position = 0; 31 32 StreamReader sr = new StreamReader(request.Body); 33 string bodyContent = await sr.ReadToEndAsync(); 34 _logInfo.RequestBody = bodyContent; 35 36 request.Body.Position = 0; 37 } 38 else if (request.Method.ToLower().Equals("get")) 39 { 40 _logInfo.RequestBody = request.QueryString.Value; 41 } 42 43 //获取Response.Body内容 44 var originalBodyStream = context.Response.Body; 45 46 using (var responseBody = new MemoryStream()) 47 { 48 context.Response.Body = responseBody; 49 50 await _next(context); 51 52 _logInfo.ResponseBody = await FormatResponse(context.Response); 53 _logInfo.ExcuteEndTime = DateTime.Now; 54 await logRepo.AddAsync(new Log 55 { 56 User = "admin", 57 Content = _logInfo.ToString(), 58 CreateTime = DateTime.Now 59 }); 60 await logRepo.SaveChangesAsync(); 61 62 await responseBody.CopyToAsync(originalBodyStream); 63 } 64 } 65 66 private async Task<string> FormatResponse(HttpResponse response) 67 { 68 response.Body.Seek(0, SeekOrigin.Begin); 69 var text = await new StreamReader(response.Body).ReadToEndAsync(); 70 response.Body.Seek(0, SeekOrigin.Begin); 71 72 return text; 73 } 74 } 75 76 public static class RequestResponseLoggingMiddlewareExtensions 77 { 78 public static IApplicationBuilder UseRequestResponseLogging(this IApplicationBuilder builder) 79 { 80 return builder.UseMiddleware<RequestResponseLoggingMiddleware>(); 81 } 82 }
转自:https://www.cnblogs.com/xiaobianzi/p/17339389.html