Files
wcs/WCS.WebApi/Controllers/RequestResponseLoggingMiddleware.cs
hehaibing-1996 d40c3f253a 提交代码
2024-04-19 08:47:45 +08:00

101 lines
3.7 KiB
C#

using System.Diagnostics;
using System.Text;
using WCS.BLL;
using WCS.BLL.DbModels;
using WCS.DAL.Db;
using WCS.Model;
namespace WCS.WebApi.Controllers
{
public class RequestResponseLoggingMiddleware
{
private readonly RequestDelegate _next;
public RequestResponseLoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var stopwatch = Stopwatch.StartNew();
var requestBody = string.Empty;
var responseBody = string.Empty;
var originalRequestBody = context.Request.Body;
var requestTime = DateTime.Now;
// 可以选择只记录特定的Content-RequestType //只记录json类型的请求
if (context.Request.ContentType != null && !context.Request.ContentType.Contains("application/json", StringComparison.OrdinalIgnoreCase))
{
;
}
try
{
////读取Request Body
//// 保存原始的Request Body
var requestBodyStream = new MemoryStream();
await originalRequestBody.CopyToAsync(requestBodyStream);
originalRequestBody.Dispose();
requestBodyStream.Position = 0; // 将流的位置重置回开始处
requestBody = await new StreamReader(requestBodyStream).ReadToEndAsync();
// 替换Request.Body以便后续中间件可以读取
requestBodyStream.Position = 0;// 将流的位置重置回开始处
context.Request.Body = requestBodyStream;
// 保存原始的Response Body
var originalResponseBodyStream = context.Response.Body;
using (var memStream = new MemoryStream())
{
context.Response.Body = memStream;
// 继续处理请求
await _next(context);
memStream.Seek(0, SeekOrigin.Begin);
responseBody = await new StreamReader(memStream).ReadToEndAsync();
memStream.Seek(0, SeekOrigin.Begin);
await memStream.CopyToAsync(originalResponseBodyStream);
}
}
catch (Exception e)
{
//return new ResponseCommon()
//{
// Code = 300,
// Message = $"操作失败:{e.Message}"
//};
}
finally
{
//TO DO如何将记日志的 和不记日志的分开 解耦
if (!context.Request.Path.ToString().Contains("getInterfaceRecord"))
try
{
var logRecord = new SystemApiLogRecord()
{
DeviceIp = context?.Connection?.RemoteIpAddress?.ToString(),
RequestUrl = context.Request.Path,
RequestBody = requestBody,
QueryString = context.Request.QueryString.ToString(),
IsResponse = true,
ResponseJson = responseBody,
RequestTime = requestTime,
ResponseTime = DateTime.Now,
ExecutionTime = stopwatch.ElapsedMilliseconds
};
await DbHelp.dbLog.Insertable(logRecord).ExecuteCommandAsync();
}
catch (Exception e)
{
//TO DO txt记录失败的日志和响应实体
}
}
}
}
}