/*********************************************************************** * Project: baifenBinfa.Net * * Web: https://baifenBinfa.com * * ProjectName: 百分兵法管理系统 * * Author: * * Email: * * Versions: 1.0 * * CreateTime: 2020-02-03 23:30:52 * FileName: RequRespLogMildd * ClassDescription: ***********************************************************************/ using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using CoreCms.Net.Configuration; using CoreCms.Net.Loging; using CoreCms.Net.Utility.Extensions; using Microsoft.AspNetCore.Http; namespace CoreCms.Net.Middlewares { /// /// 中间件 /// 记录请求和响应数据 /// public class RequRespLogMildd { /// /// /// private readonly RequestDelegate _next; /// /// /// /// public RequRespLogMildd(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { if (AppSettingsConstVars.MiddlewareRequestResponseLogEnabled) { // 过滤,只有接口 if (context.Request.Path.Value != null && (context.Request.Path.Value.Contains("api") || context.Request.Path.Value.Contains("Api"))) { context.Request.EnableBuffering(); Stream originalBody = context.Response.Body; try { // 存储请求数据 await RequestDataLog(context); await using var ms = new MemoryStream(); context.Response.Body = ms; await _next(context); // 存储响应数据 ResponseDataLog(ms); ms.Position = 0; await ms.CopyToAsync(originalBody); } catch (Exception) { // 记录异常 //ErrorLogData(context.Response, ex); } finally { context.Response.Body = originalBody; } } else { await _next(context); } } else { await _next(context); } } private static async Task RequestDataLog(HttpContext context) { var request = context.Request; var sr = new StreamReader(request.Body); var content = $" QueryData:{request.Path + request.QueryString}\r\n BodyData:{await sr.ReadToEndAsync()}"; if (!string.IsNullOrEmpty(content)) { Parallel.For(0, 1, _ => { LogLockHelper.OutSql2Log("RequestResponseLog", "RequestResponseLog" + DateTime.Now.ToString("yyyy-MM-dd-HH"), new[] { "Request Data:", content }); }); request.Body.Position = 0; } } private static void ResponseDataLog(Stream ms) { ms.Position = 0; var responseBody = new StreamReader(ms).ReadToEnd(); if (!string.IsNullOrEmpty(responseBody)) { Parallel.For(0, 1, _ => { LogLockHelper.OutSql2Log("RequestResponseLog", "RequestResponseLog" + DateTime.Now.ToString("yyyy-MM-dd-HH"), new[] { "Response Data:", responseBody }); }); } } } }