Files
wcs/WCS.WebApi/Controllers/RequestResponseLoggingMiddleware.cs

118 lines
4.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
var guid = Guid.NewGuid();
//TO DO如何将记日志的 和不记日志的分开 解耦
if (!context.Request.Path.ToString().Contains("getInterfaceRecord") && !context.Request.Path.ToString().Contains("getShelfStatus"))
{
try
{
Logs.Write($"[记录接口日志]{guid},开始记录{context.Request.Path.ToString()}", LogsType.Api);
var logRecord = new SystemApiLogRecord()
{
DeviceIp = context?.Connection?.RemoteIpAddress?.ToString(),
RequestUrl = context.Request?.Path.ToString(),
RequestBody = requestBody,
QueryString = context.Request?.QueryString.ToString(),
IsResponse = true,
ResponseJson = responseBody,
RequestTime = requestTime,
ResponseTime = DateTime.Now,
ExecutionTime = stopwatch.ElapsedMilliseconds
};
Task.Run(() =>
{
try
{
DbHelp.dbLog.Insertable(logRecord).ExecuteCommand();
}
catch (Exception ex)
{
Logs.Write($"[记录接口日志]{guid}保存数据失败!发生异常:" + ex.Message, LogsType.Api);
}
});
}
catch (Exception e)
{
Logs.Write($"[记录接口日志]{guid}失败!发生异常:" + e.Message, LogsType.Api);
}
}
else
Logs.Write($"[记录接口日志]{guid}不记录getInterfaceRecord", LogsType.Api);
}
}
}
}