From 41a5531dc31a642623f0a7a766fbe9c256ba9247 Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期二, 11 二月 2025 13:53:29 +0800
Subject: [PATCH] 优化WMS前端
---
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_Core/AOP/LogAOP.cs | 328 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 328 insertions(+), 0 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/AOP/LogAOP.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/AOP/LogAOP.cs"
new file mode 100644
index 0000000..50c3754
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/AOP/LogAOP.cs"
@@ -0,0 +1,328 @@
+锘縰sing Castle.DynamicProxy;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.SignalR;
+using Newtonsoft.Json;
+using StackExchange.Profiling;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEA_Core.Helper;
+using WIDESEA_Core.LogHelper;
+
+namespace WIDESEA_Core.AOP
+{
+ /// <summary>
+ /// 鎷︽埅鍣˙logLogAOP 缁ф壙IInterceptor鎺ュ彛
+ /// </summary>
+ public class LogAOP : IInterceptor
+ {
+ private readonly IHttpContextAccessor _accessor;
+
+ public LogAOP(IHttpContextAccessor accessor)
+ {
+ _accessor = accessor;
+ }
+
+ /// <summary>
+ /// 瀹炰緥鍖朓Interceptor鍞竴鏂规硶
+ /// </summary>
+ /// <param name="invocation">鍖呭惈琚嫤鎴柟娉曠殑淇℃伅</param>
+ public void Intercept(IInvocation invocation)
+ {
+ string UserName = _accessor.HttpContext?.User?.Identity?.Name;
+ string json;
+ try
+ {
+ if (invocation.Arguments.Any())
+ {
+ json = JsonConvert.SerializeObject(invocation.Arguments);
+ }
+ else
+ {
+ json = "鏃犲弬鏁�";
+ }
+ }
+ catch (Exception ex)
+ {
+ json = "鏃犳硶搴忓垪鍖栵紝鍙兘鏄叞濮嗚揪琛ㄨ揪寮忕瓑鍘熷洜閫犳垚锛屾寜鐓ф鏋朵紭鍖栦唬鐮�" + ex.ToString();
+ }
+
+ DateTime startTime = DateTime.Now;
+ AOPLogInfo apiLogAopInfo = new AOPLogInfo
+ {
+ RequestTime = startTime.ToString("yyyy-MM-dd hh:mm:ss fff"),
+ OpUserName = "銆愬綋鍓嶆搷浣滅敤鎴枫�戯細" + UserName,
+ RequestMethodName = "銆愬綋鍓嶆墽琛屾柟娉曘�戯細" + invocation.Method.Name,
+ RequestParamsName = "銆愭惡甯︾殑鍙傛暟鏈夈�戯細" + string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()),
+ RequestParamsData = json
+ };
+
+ var dataIntercept = $"";
+
+ try
+ {
+ MiniProfiler.Current.Step($"鎵ц{invocation.InvocationTarget}.{invocation.Method.Name}()鏂规硶 -> ");
+ //鍦ㄨ鎷︽埅鐨勬柟娉曟墽琛屽畬姣曞悗 缁х画鎵ц褰撳墠鏂规硶锛屾敞鎰忔槸琚嫤鎴殑鏄紓姝ョ殑
+ invocation.Proceed();
+
+ // 寮傛鑾峰彇寮傚父锛屽厛鎵ц
+ if (IsAsyncMethod(invocation.Method))
+ {
+ #region 鏂规涓�
+
+ //Wait task execution and modify return value
+ if (invocation.Method.ReturnType == typeof(Task))
+ {
+ invocation.ReturnValue = InternalAsyncHelper.AwaitTaskWithPostActionAndFinally(
+ (Task)invocation.ReturnValue,
+ async () => await SuccessAction(invocation, apiLogAopInfo, startTime), /*鎴愬姛鏃舵墽琛�*/
+ ex =>
+ {
+ LogEx(ex, apiLogAopInfo);
+ });
+ }
+ //Task<TResult>
+ else
+ {
+ invocation.ReturnValue = InternalAsyncHelper.CallAwaitTaskWithPostActionAndFinallyAndGetResult(
+ invocation.Method.ReturnType.GenericTypeArguments[0],
+ invocation.ReturnValue,
+ //async () => await SuccessAction(invocation, dataIntercept),/*鎴愬姛鏃舵墽琛�*/
+ async (o) => await SuccessAction(invocation, apiLogAopInfo, startTime, o), /*鎴愬姛鏃舵墽琛�*/
+ ex =>
+ {
+ LogEx(ex, apiLogAopInfo);
+ });
+ }
+
+ #endregion 鏂规涓�
+
+ // 濡傛灉鏂规涓�涓嶈锛岃瘯璇曡繖涓柟妗�
+ //#region 鏂规浜�
+
+ //var type = invocation.Method.ReturnType;
+ //var resultProperty = type.GetProperty("Result");
+ //DateTime endTime = DateTime.Now;
+ //string ResponseTime = (endTime - startTime).Milliseconds.ToString();
+ //apiLogAopInfo.ResponseTime = endTime.ToString("yyyy-MM-dd hh:mm:ss fff");
+ //apiLogAopInfo.ResponseIntervalTime = ResponseTime + "ms";
+ //apiLogAopInfo.ResponseJsonData = JsonConvert.SerializeObject(resultProperty.GetValue(invocation.ReturnValue));
+
+ ////dataIntercept += ($"銆愬搷搴旀椂闂淬�戯細{ResponseTime}ms\r\n");
+ ////dataIntercept += ($"銆愭墽琛屽畬鎴愭椂闂淬�戯細{endTime.ToString("yyyy-MM-dd hh:mm:ss fff")}\r\n");
+ ////dataIntercept += ($"銆愭墽琛屽畬鎴愮粨鏋溿�戯細{JsonConvert.SerializeObject(resultProperty.GetValue(invocation.ReturnValue))}\r\n");
+
+ //Parallel.For(0, 1, e =>
+ //{
+ // //LogLock.OutLogAOP("AOPLog", new string[] { dataIntercept });
+ // LogLock.OutLogAOP("AOPLog", new string[] { apiLogAopInfo.GetType().ToString() + " - ResponseJsonDataType:" + type, JsonConvert.SerializeObject(apiLogAopInfo) });
+ //});
+
+ //#endregion
+ }
+ else
+ {
+ // 鍚屾1
+ string jsonResult;
+ try
+ {
+ jsonResult = JsonConvert.SerializeObject(invocation.ReturnValue);
+ }
+ catch (Exception ex)
+ {
+ jsonResult = "鏃犳硶搴忓垪鍖栵紝鍙兘鏄叞濮嗚揪琛ㄨ揪寮忕瓑鍘熷洜閫犳垚锛屾寜鐓ф鏋朵紭鍖栦唬鐮�" + ex.ToString();
+ }
+
+ var type = invocation.Method.ReturnType;
+ var resultProperty = type.GetProperty("Result");
+ DateTime endTime = DateTime.Now;
+ string ResponseTime = (endTime - startTime).Milliseconds.ToString();
+ apiLogAopInfo.ResponseTime = endTime.ToString("yyyy-MM-dd hh:mm:ss fff");
+ apiLogAopInfo.ResponseIntervalTime = ResponseTime + "ms";
+ apiLogAopInfo.ResponseJsonData = jsonResult;
+ Parallel.For(0, 1, e =>
+ {
+ LogLock.OutLogAOP("AOPLog", new string[] { apiLogAopInfo.GetType().ToString(), JsonConvert.SerializeObject(apiLogAopInfo) });
+ });
+ }
+ }
+ catch (Exception ex) // 鍚屾2
+ {
+ LogEx(ex, apiLogAopInfo);
+ throw;
+ }
+ }
+
+ private async Task SuccessAction(IInvocation invocation, AOPLogInfo apiLogAopInfo, DateTime startTime, object o = null)
+ {
+ DateTime endTime = DateTime.Now;
+ string ResponseTime = (endTime - startTime).Milliseconds.ToString();
+ apiLogAopInfo.ResponseTime = endTime.ToString("yyyy-MM-dd hh:mm:ss fff");
+ apiLogAopInfo.ResponseIntervalTime = ResponseTime + "ms";
+ apiLogAopInfo.ResponseJsonData = JsonConvert.SerializeObject(o);
+
+ await Task.Run(() =>
+ {
+ Parallel.For(0, 1, e =>
+ {
+ //LogLock.OutSql2Log("AOPLog", new string[] { JsonConvert.SerializeObject(apiLogAopInfo) });
+ LogLock.OutLogAOP("AOPLog", new string[] { apiLogAopInfo.GetType().ToString(), JsonConvert.SerializeObject(apiLogAopInfo) });
+ });
+ });
+ }
+
+ private void LogEx(Exception ex, AOPLogInfo dataIntercept)
+ {
+ if (ex != null)
+ {
+ //鎵ц鐨� service 涓紝鏀跺綍寮傚父
+ MiniProfiler.Current.CustomTiming("Errors锛�", ex.Message);
+ //鎵ц鐨� service 涓紝鎹曡幏寮傚父
+ AOPLogExInfo apiLogAopExInfo = new AOPLogExInfo
+ {
+ ExMessage = ex.Message,
+ InnerException = "InnerException-鍐呴儴寮傚父:\r\n" + (ex.InnerException == null ? "" : ex.InnerException.InnerException.ToString()) +
+ "\r\nStackTrace-鍫嗘爤璺熻釜:\r\n" + (ex.StackTrace == null ? "" : ex.StackTrace.ToString()),
+ ApiLogAopInfo = dataIntercept
+ };
+ // 寮傚父鏃ュ織閲屾湁璇︾粏鐨勫爢鏍堜俊鎭�
+ Parallel.For(0, 1, e =>
+ {
+ LogLock.OutLogAOP("AOPLogEx", new string[] { apiLogAopExInfo.GetType().ToString(), JsonConvert.SerializeObject(apiLogAopExInfo) });
+ });
+ }
+ }
+
+ public static bool IsAsyncMethod(MethodInfo method)
+ {
+ return
+ method.ReturnType == typeof(Task) ||
+ method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)
+ ;
+ }
+ }
+
+ internal static class InternalAsyncHelper
+ {
+ public static async Task AwaitTaskWithPostActionAndFinally(Task actualReturnValue, Func<Task> postAction, Action<Exception> finalAction)
+ {
+ Exception exception = null;
+
+ try
+ {
+ await actualReturnValue;
+ await postAction();
+ }
+ catch (Exception ex)
+ {
+ exception = ex;
+ }
+ finally
+ {
+ finalAction(exception);
+ }
+ }
+
+ public static async Task<T> AwaitTaskWithPostActionAndFinallyAndGetResult<T>(Task<T> actualReturnValue, Func<object, Task> postAction,
+ Action<Exception> finalAction)
+ {
+ Exception exception = null;
+ try
+ {
+ var result = await actualReturnValue;
+ await postAction(result);
+ return result;
+ }
+ catch (Exception ex)
+ {
+ exception = ex;
+ throw;
+ }
+ finally
+ {
+ finalAction(exception);
+ }
+ }
+
+ public static object CallAwaitTaskWithPostActionAndFinallyAndGetResult(Type taskReturnType, object actualReturnValue,
+ Func<object, Task> action, Action<Exception> finalAction)
+ {
+ return typeof(InternalAsyncHelper)
+ .GetMethod("AwaitTaskWithPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)
+ .MakeGenericMethod(taskReturnType)
+ .Invoke(null, new object[] { actualReturnValue, action, finalAction });
+ }
+ }
+
+ public class AOPLogInfo
+ {
+ /// <summary>
+ /// 璇锋眰鏃堕棿
+ /// </summary>
+ [Description("璇锋眰鏃堕棿")]
+ public string RequestTime { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 鎿嶄綔浜哄憳
+ /// </summary>
+ [Description("鎿嶄綔浜哄憳")]
+ public string OpUserName { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 璇锋眰鏂规硶鍚�
+ /// </summary>
+ [Description("璇锋眰鏂规硶鍚�")]
+ public string RequestMethodName { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 璇锋眰鍙傛暟鍚�
+ /// </summary>
+ [Description("璇锋眰鍙傛暟鍚�")]
+ public string RequestParamsName { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 璇锋眰鍙傛暟鏁版嵁JSON
+ /// </summary>
+ [Description("璇锋眰鍙傛暟鏁版嵁JSON")]
+ public string RequestParamsData { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 璇锋眰鍝嶅簲闂撮殧鏃堕棿
+ /// </summary>
+ [Description("璇锋眰鍝嶅簲闂撮殧鏃堕棿")]
+ public string ResponseIntervalTime { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 鍝嶅簲鏃堕棿
+ /// </summary>
+ [Description("鍝嶅簲鏃堕棿")]
+ public string ResponseTime { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 鍝嶅簲缁撴灉
+ /// </summary>
+ [Description("鍝嶅簲缁撴灉")]
+ public string ResponseJsonData { get; set; } = string.Empty;
+ }
+
+ public class AOPLogExInfo
+ {
+ public AOPLogInfo ApiLogAopInfo { get; set; }
+
+ /// <summary>
+ /// 寮傚父
+ /// </summary>
+ [Description("寮傚父")]
+ public string InnerException { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 寮傚父淇℃伅
+ /// </summary>
+ [Description("寮傚父淇℃伅")]
+ public string ExMessage { get; set; } = string.Empty;
+ }
+}
\ No newline at end of file
--
Gitblit v1.9.3