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.Threading.Tasks; 
 | 
using WIDESEA_Core.Helper; 
 | 
using WIDESEA_Core.LogHelper; 
 | 
  
 | 
namespace WIDESEA_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 (AppSettings.app("Middleware", "RequestResponseLog", "Enabled").ObjToBool()) 
 | 
            { 
 | 
                // 过滤,只有接口 
 | 
                if (context.Request.Path.Value.Contains("api")) 
 | 
                { 
 | 
                    context.Request.EnableBuffering(); 
 | 
                    //Stream originalBody = context.Response.Body; 
 | 
  
 | 
                    try 
 | 
                    { 
 | 
                        // 存储请求数据 
 | 
                        //string requestParam = GetRequestData(context); 
 | 
                        //DateTime beginDate = DateTime.Now; 
 | 
  
 | 
                        //using var ms = new MemoryStream(); 
 | 
                        //context.Response.Body = ms; 
 | 
  
 | 
                        await _next(context); 
 | 
  
 | 
                        // 存储响应数据 
 | 
                        //DateTime endDate = DateTime.Now; 
 | 
                        //string responseParam = GetResponsetData(context); 
 | 
  
 | 
                        //context.Response.Body.Position = 0; 
 | 
                        //await context.Response.Body.CopyToAsync(originalBody); 
 | 
  
 | 
                        //Logger.WriteApiLog2DB(context,requestParam, beginDate, responseParam, endDate, context.Response.StatusCode == 200 ? LoggerStatus.Success : LoggerStatus.Error); 
 | 
                    } 
 | 
                    catch (Exception ex) 
 | 
                    { 
 | 
                        // 记录异常                         
 | 
                        _logger.LogError(ex.Message + "" + ex.InnerException); 
 | 
                    } 
 | 
                    finally 
 | 
                    { 
 | 
                        //context.Response.Body = originalBody; 
 | 
                    } 
 | 
                } 
 | 
                //else 
 | 
                //{ 
 | 
                //    await _next(context); 
 | 
                //} 
 | 
            } 
 | 
            //else 
 | 
            //{ 
 | 
            //    await _next(context); 
 | 
            //} 
 | 
        } 
 | 
  
 | 
        private string GetRequestData(HttpContext context) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                using StreamReader sr = new StreamReader(context.Request.Body); 
 | 
                string request = JsonConvert.SerializeObject(sr.ReadToEnd()); ; 
 | 
                context.Request.Body.Position = 0; 
 | 
                return request; 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return $"请求参数获取错误,{ex.Message}"; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        private string GetResponsetData(HttpContext context) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                using StreamReader sr = new StreamReader(context.Response.Body); 
 | 
                string response = JsonConvert.SerializeObject(sr.ReadToEnd()); ; 
 | 
                context.Response.Body.Position = 0; 
 | 
                return response; 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return $"响应参数获取错误,{ex.Message}"; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |