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

posted @ 2024-08-02 16:54  Chanwah  阅读(52)  评论(0)    收藏  举报