using Microsoft.AspNetCore.Http; 
 | 
using Microsoft.Extensions.Logging; 
 | 
using Newtonsoft.Json; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using System.Text; 
 | 
using System.Text.RegularExpressions; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEAWCS_Core.Helper; 
 | 
using WIDESEAWCS_Core.LogHelper; 
 | 
  
 | 
namespace WIDESEAWCS_Core.Middlewares 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// 记录请求和响应数据 
 | 
    /// </summary> 
 | 
    public class ApiLogMiddleware 
 | 
    { 
 | 
        /// <summary> 
 | 
        ///  
 | 
        /// </summary> 
 | 
        private readonly RequestDelegate _next; 
 | 
        private readonly ILogger<ApiLogMiddleware> _logger; 
 | 
  
 | 
        public ApiLogMiddleware(RequestDelegate next, ILogger<ApiLogMiddleware> logger) 
 | 
        { 
 | 
            _next = next; 
 | 
            _logger = logger; 
 | 
        } 
 | 
  
 | 
        //todo 
 | 
        public async Task InvokeAsync(HttpContext context) 
 | 
        { 
 | 
            // 过滤,只有接口 
 | 
            if (context.Request.Path.Value?.Contains("api") ?? false) 
 | 
            { 
 | 
                context.Request.EnableBuffering(); 
 | 
                Stream originalBody = context.Response.Body; 
 | 
                string requestParam = string.Empty; 
 | 
                string responseParam = string.Empty; 
 | 
                try 
 | 
                { 
 | 
                    (context.RequestServices.GetService(typeof(RequestLogModel)) as RequestLogModel).RequestDate = DateTime.Now; 
 | 
                    try 
 | 
                    { 
 | 
                        // 存储请求数据 
 | 
                        requestParam = RequestDataLog(context); 
 | 
                        context.Request.Body.Position = 0; 
 | 
                    } 
 | 
                    catch { } 
 | 
                    using MemoryStream ms = new(); 
 | 
                    context.Response.Body = ms; 
 | 
  
 | 
                    await _next(context); 
 | 
  
 | 
                    try 
 | 
                    { 
 | 
                        // 存储响应数据 
 | 
                        responseParam = ResponseDataLog(context.Response); 
 | 
                    } 
 | 
                    catch { } 
 | 
  
 | 
                    ms.Position = 0; 
 | 
                    await ms.CopyToAsync(originalBody); 
 | 
                    if (!(context.Request.Path.Value?.Contains("Get") ?? false)) 
 | 
                        Logger.Add(requestParam, responseParam); 
 | 
                } 
 | 
                catch (Exception ex) 
 | 
                { 
 | 
                    // 记录异常 
 | 
  
 | 
                } 
 | 
                finally 
 | 
                { 
 | 
                    context.Response.Body = originalBody; 
 | 
                } 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                await _next(context); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        private string RequestDataLog(HttpContext context) 
 | 
        { 
 | 
            var request = context.Request; 
 | 
            var sr = new StreamReader(request.Body); 
 | 
  
 | 
            object obj = new 
 | 
            { 
 | 
                QueryString = request.QueryString.ToString(), 
 | 
                BodyData = sr.ReadToEndAsync().Result 
 | 
            }; 
 | 
  
 | 
            string data = JsonConvert.SerializeObject(obj); 
 | 
  
 | 
            request.Body.Position = 0; 
 | 
  
 | 
            return data; 
 | 
        } 
 | 
  
 | 
        private string ResponseDataLog(HttpResponse response) 
 | 
        { 
 | 
            response.Body.Position = 0; 
 | 
            using StreamReader stream = new StreamReader(response.Body, leaveOpen: true); 
 | 
            string body = stream.ReadToEnd(); 
 | 
            response.Body.Position = 0; 
 | 
            return body; 
 | 
        } 
 | 
    } 
 | 
} 
 |