using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using Newtonsoft.Json; using System.Text; namespace LearningOfficer.OA.Mobile.Api.Filters { public class GlobalOperationLogFilter : IAsyncActionFilter { private readonly ILogger _logger; public GlobalOperationLogFilter(ILogger logger ) { _logger = logger; } public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { //// 获取请求信息 var paramss = context.ActionDescriptor.Parameters; var ActionName = ((ControllerActionDescriptor)context.ActionDescriptor)?.ActionName; var Method = context.HttpContext.Request.Method; var queryString = context.HttpContext.Request.QueryString; var RequestUrl = context.HttpContext.Request.Host + context.HttpContext.Request.Path; string token = context.HttpContext.Request.Headers["Authorization"].FirstOrDefault(); string body = ""; var request = context.HttpContext.Request; var stream = request.Body; if (request.ContentLength != null && request.ContentLength > 0) { request.EnableBuffering(); request.Body.Position = 0;//将读取指针迻到开始位置 using (var reader = new StreamReader(stream, Encoding.UTF8, true, 1024, true)) { body = await reader.ReadToEndAsync(); } } _logger.LogInformation(context.HttpContext.TraceIdentifier + ": {RequestParams}", body); await next(); } private async Task GetRequestBody(HttpRequest request) { request.EnableBuffering(); var body = request.Body; var buffer = new byte[Convert.ToInt32(request.ContentLength)]; await request.Body.ReadAsync(buffer, 0, buffer.Length); request.Body.Position = 0; // 重置流位置 return Encoding.UTF8.GetString(buffer); } private async Task GetResponseBody(HttpResponse response) { response.Body.Seek(0, SeekOrigin.Begin); var body = await new StreamReader(response.Body).ReadToEndAsync(); response.Body.Seek(0, SeekOrigin.Begin); return body; } } }