diff --git a/Infrastructure/Model/ApiResult.cs b/Infrastructure/Model/ApiResult.cs
index 672b0dc..d322029 100644
--- a/Infrastructure/Model/ApiResult.cs
+++ b/Infrastructure/Model/ApiResult.cs
@@ -111,6 +111,11 @@ namespace Infrastructure.Model
///
///
public static ApiResult Error(string msg) { return new ApiResult((int)ResultCode.CUSTOM_ERROR, msg); }
+
+ public override string ToString()
+ {
+ return $"msg={Msg},data={Data}";
+ }
}
public class ApiResult : ApiResult
diff --git a/ZR.Admin.WebApi/Controllers/BaseController.cs b/ZR.Admin.WebApi/Controllers/BaseController.cs
index 126d0f1..43e2710 100644
--- a/ZR.Admin.WebApi/Controllers/BaseController.cs
+++ b/ZR.Admin.WebApi/Controllers/BaseController.cs
@@ -12,7 +12,6 @@ using ZR.Admin.WebApi.Filters;
namespace ZR.Admin.WebApi.Controllers
{
- [LogActionFilter]
public class BaseController : ControllerBase
{
public static string TIME_FORMAT_FULL = "yyyy-MM-dd HH:mm:ss";
diff --git a/ZR.Admin.WebApi/Extensions/HttpContextExtension.cs b/ZR.Admin.WebApi/Extensions/HttpContextExtension.cs
index a582619..535d9d8 100644
--- a/ZR.Admin.WebApi/Extensions/HttpContextExtension.cs
+++ b/ZR.Admin.WebApi/Extensions/HttpContextExtension.cs
@@ -6,8 +6,10 @@ using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Security.Claims;
+using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using UAParser;
@@ -161,6 +163,32 @@ namespace ZR.Admin.WebApi.Extensions
});
}).Wait();
}
+
+
+ ///
+ /// 设置请求参数
+ ///
+ ///
+ ///
+ public static void GetRequestValue(this HttpContext context, SysOperLog operLog)
+ {
+ string reqMethod = operLog.requestMethod;
+ string param;
+
+ if (HttpMethods.IsPost(reqMethod) || HttpMethods.IsPut(reqMethod))
+ {
+ context.Request.Body.Seek(0, SeekOrigin.Begin);
+ using var reader = new StreamReader(context.Request.Body, Encoding.UTF8);
+ //需要使用异步方式才能获取
+ param = reader.ReadToEndAsync().Result;
+ }
+ else
+ {
+ param = context.Request.QueryString.Value.ToString();
+ }
+ operLog.operParam = param;
+ }
+
}
}
diff --git a/ZR.Admin.WebApi/Filters/GlobalActionMonitor.cs b/ZR.Admin.WebApi/Filters/GlobalActionMonitor.cs
index 7ed2ab1..dbe4a18 100644
--- a/ZR.Admin.WebApi/Filters/GlobalActionMonitor.cs
+++ b/ZR.Admin.WebApi/Filters/GlobalActionMonitor.cs
@@ -1,27 +1,43 @@
using Infrastructure;
+using Infrastructure.Attribute;
using Infrastructure.Model;
+using IPTools.Core;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using NLog;
using System;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ZR.Admin.WebApi.Extensions;
+using ZR.Model.System;
+using ZR.Service.System.IService;
namespace ZR.Admin.WebApi.Filters
{
- public class GlobalActionMonitor : Attribute, IActionFilter
+ public class GlobalActionMonitor : ActionFilterAttribute
{
static readonly Logger logger = LogManager.GetCurrentClassLogger();
+ private ISysOperLogService OperLogService;
+ public GlobalActionMonitor(ISysOperLogService operLogService)
+ {
+ OperLogService = operLogService;
+ }
///
- /// OnActionExecuting是在Action执行之前运行的方法。
+ /// Action请求前
///
///
- public void OnActionExecuting(ActionExecutingContext context)
+ ///
+ ///
+ public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
- if (context.ModelState.IsValid) return;
- ApiResult response = new ApiResult();
+ ApiResult response = new();
response.Code = (int)ResultCode.PARAM_ERROR;
- //var keys = context.ModelState.Keys;
var values = context.ModelState.Values;
foreach (var item in values)
{
@@ -29,7 +45,7 @@ namespace ZR.Admin.WebApi.Filters
{
if (err.ErrorMessage.Contains("JSON"))
{
- return;
+ return next();
}
if (!string.IsNullOrEmpty(response.Msg))
{
@@ -39,16 +55,94 @@ namespace ZR.Admin.WebApi.Filters
response.Msg += err.ErrorMessage;
}
}
- logger.Info($"请求参数错误,{response.Msg}");
- context.Result = new JsonResult(response);
+ if (!string.IsNullOrEmpty(response.Msg))
+ {
+ logger.Info($"请求参数错误,{response.Msg}");
+ context.Result = new JsonResult(response);
+ }
+ return next();
}
///
/// OnActionExecuted是在Action中的代码执行之后运行的方法。
///
///
- public void OnActionExecuted(ActionExecutedContext context)
+ public override void OnResultExecuted(ResultExecutedContext context)
{
+ if (context.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor) return;
+
+ //获得注解信息
+ LogAttribute logAttribute = GetLogAttribute(controllerActionDescriptor);
+ if (logAttribute == null) return;
+
+ try
+ {
+ string method = context.HttpContext.Request.Method.ToUpper();
+ // 获取当前的用户
+ string userName = context.HttpContext.GetName();
+ string jsonResult = string.Empty;
+ if (context.Result is ContentResult result && result.ContentType == "application/json")
+ {
+ jsonResult = result.Content.Replace("\r\n", "").Trim();
+ }
+ if (context.Result is JsonResult result2)
+ {
+ jsonResult = result2.Value?.ToString();
+ }
+ //获取当前执行方法的类名
+ //string className = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;
+ //获取当前成员的名称
+ //string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name;
+ string controller = context.RouteData.Values["Controller"].ToString();
+ string action = context.RouteData.Values["Action"].ToString();
+
+ string ip = HttpContextExtension.GetClientUserIp(context.HttpContext);
+ var ip_info = IpTool.Search(ip);
+
+ SysOperLog sysOperLog = new()
+ {
+ status = 0,
+ operName = userName,
+ operIp = ip,
+ operUrl = HttpContextExtension.GetRequestUrl(context.HttpContext),
+ requestMethod = method,
+ jsonResult = jsonResult,
+ operLocation = ip_info.Province + " " + ip_info.City,
+ method = controller + "." + action + "()",
+ //Elapsed = _stopwatch.ElapsedMilliseconds,
+ operTime = DateTime.Now
+ };
+ HttpContextExtension.GetRequestValue(context.HttpContext, sysOperLog);
+
+ if (logAttribute != null)
+ {
+ sysOperLog.title = logAttribute?.Title;
+ sysOperLog.businessType = (int)logAttribute?.BusinessType;
+ sysOperLog.operParam = logAttribute.IsSaveRequestData ? sysOperLog.operParam : "";
+ sysOperLog.jsonResult = logAttribute.IsSaveResponseData ? sysOperLog.jsonResult : "";
+ }
+
+ LogEventInfo ei = new(LogLevel.Info, "GlobalExceptionMiddleware", "");
+ ei.Properties["status"] = 0;
+ ei.Properties["jsonResult"] = !HttpMethods.IsGet(method) ? jsonResult : "";
+ ei.Properties["requestParam"] = sysOperLog.operParam;
+ ei.Properties["user"] = userName;
+ logger.Log(ei);
+
+ OperLogService.InsertOperlog(sysOperLog);
+ }
+ catch (Exception ex)
+ {
+ logger.Error(ex, $"记录操作日志出错了#{ex.Message}");
+ }
+ }
+
+ private LogAttribute GetLogAttribute(ControllerActionDescriptor controllerActionDescriptor)
+ {
+ var attribute = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true)
+ .FirstOrDefault(a => a.GetType().Equals(typeof(LogAttribute)));
+
+ return (LogAttribute)attribute;
}
}
}
diff --git a/ZR.Admin.WebApi/Filters/LogActionFilter.cs b/ZR.Admin.WebApi/Filters/LogActionFilter.cs
index 1c52b59..dc87730 100644
--- a/ZR.Admin.WebApi/Filters/LogActionFilter.cs
+++ b/ZR.Admin.WebApi/Filters/LogActionFilter.cs
@@ -74,7 +74,7 @@ namespace ZR.Admin.WebApi.Filters
//Elapsed = _stopwatch.ElapsedMilliseconds,
operTime = DateTime.Now
};
- GetRequestValue(sysOperLog, context.HttpContext);
+ HttpContextExtension.GetRequestValue(context.HttpContext, sysOperLog);
if (logAttribute != null)
{
@@ -110,29 +110,5 @@ namespace ZR.Admin.WebApi.Filters
return (LogAttribute)attribute;
}
- ///
- /// 设置请求参数
- ///
- ///
- ///
- public static void GetRequestValue(SysOperLog operLog, HttpContext context)
- {
- string reqMethod = operLog.requestMethod;
- string param;
-
- if (HttpMethods.IsPost(reqMethod) || HttpMethods.IsPut(reqMethod))
- {
- context.Request.Body.Seek(0, SeekOrigin.Begin);
- using var reader = new StreamReader(context.Request.Body, Encoding.UTF8);
- //需要使用异步方式才能获取
- param = reader.ReadToEndAsync().Result;
- }
- else
- {
- param = context.Request.QueryString.Value.ToString();
- }
- operLog.operParam = param;
- }
-
}
}
\ No newline at end of file
diff --git a/ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs b/ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs
index cca6d89..e02c999 100644
--- a/ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs
+++ b/ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs
@@ -84,7 +84,7 @@ namespace ZR.Admin.WebApi.Middleware
operLocation = ip_info.Province + " " + ip_info.City,
operTime = DateTime.Now
};
- LogActionFilter.GetRequestValue(sysOperLog, context);
+ HttpContextExtension.GetRequestValue(context, sysOperLog);
LogEventInfo ei = new(logLevel, "GlobalExceptionMiddleware", error);
ei.Exception = ex;
diff --git a/ZR.Admin.WebApi/Startup.cs b/ZR.Admin.WebApi/Startup.cs
index 5867847..c57fc79 100644
--- a/ZR.Admin.WebApi/Startup.cs
+++ b/ZR.Admin.WebApi/Startup.cs
@@ -77,7 +77,7 @@ namespace ZR.Admin.WebApi
services.AddMvc(options =>
{
- options.Filters.Add(typeof(GlobalActionMonitor));//ȫע쳣
+ options.Filters.Add(typeof(GlobalActionMonitor));//ȫע
})
.AddJsonOptions(options =>
{