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}";
}
}
}
}