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 { /// /// 记录请求和响应数据 /// public class ApiLogMiddleware { /// /// /// private readonly RequestDelegate _next; private readonly ILogger _logger; public ApiLogMiddleware(RequestDelegate next, ILogger 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}"; } } } }