ConcurrentQueue对列的基本使用方式
队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。
ConcurrentQueue<T>队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构。
1 对列初始化: 2 3 ConcurrentQueue<ApiLogContract> Queue = new ConcurrentQueue<ApiLogContract>(); 4 5 /// <summary> 6 /// 单条入队列 7 /// </summary> 8 /// <param name="model">入列模型</param> 9 10 Queue.Enqueue(model); 11 12 13 14 /// <summary> 15 /// 多条入队 16 /// </summary> 17 /// <param name="list"></param> 18 19 List<ApiLogContract> list = new List<ApiLogContract>(); 20 21 list.add(new model{}); 22 23 list.add(new model{}); 24 25 list.add(new model{}); 26 27 list.add(new model{}); 28 29 list.ForEach(t => Enqueue(t)); 30 31 32 33 /// <summary> 34 /// 单条出队 35 /// </summary> 36 /// <returns></returns> 37 38 ApiLogContract apiLog = null; 39 Queue.TryDequeue(out apiLog); 40 41 42 43 /// <summary> 44 /// 多条出队 45 /// </summary> 46 /// <param name="count">数量</param> 47 /// <returns></returns> 48 49 var logs = new List<ApiLogContract>(); 50 51 if (Queue.Count > 0) 52 { 53 for (int i = 0; i < count; i++) 54 { 55 var source = Dequeue(); 56 if (source != null) 57 { 58 logs.Add(source); 59 } 60 } 61 }
/// <summary> /// 获取对列数量 /// </summary> /// <returns></returns> Queue.Count
/// <summary> /// 确定序列是否包含任何元素[用于判断对列是否有要处理的数据]这个方法的性能比Count()方法快 /// </summary> /// <returns></returns>
Queue.Any()
以上就是对列的基本使用方法。
对列的使用场景有很多。所有要异步处理的都可以使用对列的方式。如接口日志异步处理,邮件、短信异步发送等。对列一般配合单例设计模式和线程一起使用更佳。
示例:
接口日志异步写入。不影响接口性能。
/// <summary> /// 接口日志对列 /// </summary> public sealed class ApiLogQueueService { #region 属性成员 /// <summary> /// 单例 /// </summary> private static ApiLogQueueService _Instance = new ApiLogQueueService(); /// <summary> /// 上次写入时间 /// </summary> public DateTime LastWriteTime = DateTime.Now; /// <summary> /// 是否写入运行线程日志 /// </summary> public bool IsWriteInitLog = false; /// <summary> /// 是否刷新缓存 /// </summary> public bool IsRefreshCache = false; /// <summary> /// 上次刷新时间 /// </summary> public DateTime LastRefreshTime = DateTime.Now; /// <summary> /// 是否写入监控线程日志 /// </summary> public bool IsWriteMonitorLog = false; /// <summary> /// 接口日志服务类对象 /// </summary> private IApiLogService logsService = ServiceFactory.ApiLogs; /// <summary> /// 队列 /// </summary> private static readonly ConcurrentQueue<ApiLogServiceModel> Queue = new ConcurrentQueue<ApiLogServiceModel>(); #endregion /// <summary> /// 私有默认构造 /// </summary> private ApiLogQueueService() { Init(); InitMonitoring(); } /// <summary> /// 单例只读属性 /// </summary> public static ApiLogQueueService Instance { get { return _Instance; } } #region 操作对列方法 /// <summary> /// 单条入队列 /// </summary> /// <param name="model">入列模型</param> public void Enqueue(ApiLogServiceModel model) { //判断是否使用日志对列 if (Queue.Count < SystemConst.Queue.ApiLogQueueMaxCount)// && ServiceFactory.DictionaryItem.QueueIsOn() { Queue.Enqueue(model); } else { //string responseData = model.ResponseModel != null ? model.ResponseModel string.Empty; //if (string.IsNullOrEmpty(responseData) && model.ResponseModel != null) //{ // responseData = JsonConvert.SerializeObject(model.ResponseModel); //} //logsService.AddLog(model.LogTypeEnum, model.ProjectId, model.InterfaceNameEnum, model.RequestData, responseData, model.SearchText1, model.SearchText2, model.ElapsedTime, model.CreatedBy, model.Remark); } } /// <summary> /// 多条入队 /// </summary> /// <param name="list"></param> public void Enqueue(List<ApiLogServiceModel> list) { list.ForEach(t => Enqueue(t)); } /// <summary> /// 单条出队 /// </summary> /// <returns></returns> public ApiLogServiceModel Dequeue() { ApiLogServiceModel apiLog; Queue.TryDequeue(out apiLog); return apiLog; } /// <summary> /// 多条出队 /// </summary> /// <param name="count">数量</param> /// <returns></returns> public List<ApiLog> Dequeue(int count) { var logs = new List<ApiLog>(); if (Queue.Count > 0) { for (int i = 0; i < count; i++) { var source = Dequeue(); if (source != null) { var model = new ApiLog() { Search1 = string.IsNullOrEmpty(source.Search1) ? string.Empty : source.Search1, Search2 = string.IsNullOrEmpty(source.Search2) ? string.Empty : source.Search2, ClassName = source.ClassName.SubstringExtend(100), Method = source.Method.SubstringExtend(100), Type = source.Type, ProjectId = source.ProjectId, Code = source.Code, RequestData = source.RequestModel != null ? JsonConvert.SerializeObject(source.RequestModel) : source.RequestData, ResponseData = source.ResponseModel != null ? JsonConvert.SerializeObject(source.ResponseModel) : source.ResponseData, ResultCode = source.ResultCode, ElapsedTime = source.ElapsedTime, ExecuteStartTime = source.ExecuteStartTime, ExecuteEndTime = source.ExecuteEndTime, TimeDifference = source.TimeDifference, Remark = source.Remark, RowStatus = TrueOrFalseEnum.True.GetHashCode(), CreatedBy = source.CreatedBy, CreatedOn = DateTime.Now, UpdatedBy = source.UpdatedBy,//source.UpdatedBy CommonHelp.ServiceIp UpdatedOn = SystemConst.DateTimeDefault }; model.Search1 = source.Search1.SubstringExtend(100); model.Search2 = model.Search2.SubstringExtend(100); logs.Add(model); } else { break; } } } return logs; } /// <summary> /// 获取对列数量 /// </summary> /// <returns></returns> public int GetCount() { return Queue.Count; } #endregion #region 对列处理机制和监控机制 /// <summary> /// 初始化方法 /// </summary> private void Init() { logsService.AddLogQueue("Init", InterfaceName.ApiLogQueue, "运行线程日志Init", "Init", 0, CommonHelp.ServiceIp); Task.Factory.StartNew(t => { logsService.AddLogQueue("Init", InterfaceName.ApiLogQueue, "运行线程日志Init-->StartNew", "Init", 0, CommonHelp.ServiceIp); while (true) { //判断消费队列是否小于某个值 try { var queueCount = GetCount(); //批量获取日志写入数据库 //logsService.AddModelBatch(Dequeue(SystemConst.Queue.ApiLogQueueCount)); if (queueCount >= SystemConst.Queue.ApiLogQueueCount && queueCount <= SystemConst.Queue.ApiLogQueueDangerCount) { LastWriteTime = DateTime.Now; //批量获取日志写入数据库 logsService.AddModelBatch(Dequeue(SystemConst.Queue.ApiLogQueueCount)); } else if (DateTime.Now >= LastWriteTime.AddMinutes(1)) { LastWriteTime = DateTime.Now; var apiLogs = Dequeue(queueCount); if (apiLogs.Count > 0) { //批量获取日志写入数据库 logsService.AddModelBatch(apiLogs); apiLogs.Clear(); } } #region 自己的运行日志 if (DateTime.Now.Minute == SystemConst.Queue.ApiWriteLogMinute && !IsWriteInitLog) { logsService.AddLogQueue("Init", InterfaceName.ApiLogQueue, string.Format("运行线程日志Init-->StartNew-->while,当前对列数量:[{0}],时间:{1},IsWriteInitLog:{2}", queueCount, DateTime.Now.Minute, !IsWriteInitLog), "Init", queueCount, CommonHelp.ServiceIp); IsWriteInitLog = true; } else if (DateTime.Now.Minute > SystemConst.Queue.ApiWriteLogMinute && IsWriteInitLog) { IsWriteInitLog = false; } #endregion } catch (Exception ex) { logsService.AddLogQueue(ApiLogType.Error, 0, InterfaceName.ApiLogQueue, ex.ToString(), string.Empty, "Init", 0, CommonHelp.ServiceIp); } //Thread.Sleep(100); Thread.Sleep(10); } }, null); } /// <summary> /// 初始化监控方法 /// </summary> private void InitMonitoring() { logsService.AddLogQueue("InitMonitoring", InterfaceName.ApiLogQueue, "监控线程日志InitMonitoring", "InitMonitoring", 0, CommonHelp.ServiceIp); Task.Factory.StartNew(t => { logsService.AddLogQueue("InitMonitoring", InterfaceName.ApiLogQueue, "监控线程日志InitMonitoring-->StartNew", "InitMonitoring", 0, CommonHelp.ServiceIp); while (true) { //判断消费队列是否小于某个值 try { var queueCount = GetCount(); if (queueCount > SystemConst.Queue.ApiLogQueueWarningCount) { var content = string.Format("接口日志对列已到达报警值{0},当前对列数量为:[{1}].", SystemConst.Queue.ApiLogQueueWarningCount, queueCount); //记录报警日志 logsService.AddLogQueue("InitMonitoring", InterfaceName.ApiLogQueue, content, "InitMonitoring", 0, CommonHelp.ServiceIp); //发报警邮件 //new EmailUtils().SendWarningEmail("ApiLogQueueService", "InitMonitoring", content, LogType.Warning); LastWriteTime = DateTime.Now; logsService.AddModelBatch(Dequeue(queueCount)); } #region 接口日志对列已到达危险值报警 if (queueCount > SystemConst.Queue.ApiLogQueueDangerCount)//ApiLogQueueDangerCount { var content = string.Format("接口日志对列已到达危险值{0},当前对列数量为:[{1}].", SystemConst.Queue.ApiLogQueueDangerCount, queueCount); //记录报警日志 logsService.AddLogQueue("InitMonitoring", InterfaceName.ApiLogQueue, content, "InitMonitoring", 0, CommonHelp.ServiceIp); //发报警邮件 //new EmailUtils().SendWarningEmail("ApiLogQueueService", "InitMonitoring", content, LogType.Error); } #endregion #region 监控线程自己运行日志 if (DateTime.Now.Hour == SystemConst.Queue.ApiWriteLogHour && !IsWriteMonitorLog) { logsService.AddLogQueue("InitMonitoring", InterfaceName.ApiLogQueue, string.Format("监控线程日志InitMonitoring-->StartNew-->while,当前对列数量:[{0}]", queueCount), "InitMonitoring", queueCount, CommonHelp.ServiceIp); IsWriteMonitorLog = true; } else if (DateTime.Now.Hour > SystemConst.Queue.ApiWriteLogHour && IsWriteInitLog) { IsWriteMonitorLog = false; } #endregion } catch (Exception ex) { logsService.AddLogQueue(ApiLogType.Error, 0, InterfaceName.ApiLogQueue, ex.ToString(), string.Empty, "InitMonitoring", 0, CommonHelp.ServiceIp); } Thread.Sleep(1000);//1秒监控一次 } }, null); } #endregion public void AddLog() { logsService.AddLogQueue("AddLog", InterfaceName.ApiLogQueue, "对列测试日志AddLog1", "AddLog", 0, CommonHelp.ServiceIp); logsService.AddModelBatch(Dequeue(SystemConst.Queue.ApiLogQueueCount)); logsService.AddLogQueue("AddLog", InterfaceName.ApiLogQueue, "对列测试日志AddLog1", "AddLog", 0, CommonHelp.ServiceIp); } public void AddLog(string className, string method, ApiLogType logType, int projectId, int code, string requestData, string responseData, string remark, int resultCode, long elapsedTime, string createdBy, string search1 = "", string search2 = "") { logsService.AddLog(className, method, logType, projectId, code, requestData, responseData, remark, resultCode, elapsedTime, createdBy, search1, search2); } }
调用
BaseController
/// <summary> /// 添加日志 /// </summary> /// <param name="interfaceName"></param> /// <param name="className"></param> /// <param name="method"></param> /// <param name="reqModel">请求参数对象</param> /// <param name="rspModel">请求参数对象</param> /// <param name="resultCode">请求参数对象</param> /// <param name="sw">计时器对象</param> /// <param name="search1">查询条件1</param> /// <param name="search2">查询条件2</param> /// <param name="logType">日志类型</param> protected void AddLogElapsedTime(InterfaceName interfaceName, string className, string method, object reqModel, object rspModel, int resultCode, Stopwatch sw, Exception ex, string search1 = "", string search2 = "", ApiLogType logType = ApiLogType.Common) { sw.Stop(); ApiLogQueueService.Instance.Enqueue(new ApiLogServiceModel() { Search1 = search1.SubstringExtend(100), Search2 = search2.SubstringExtend(100), ClassName = className.SubstringExtend(100), Method = method.SubstringExtend(100), Type = ex == null ? ApiLogType.Common.GetHashCode() : ApiLogType.Error.GetHashCode(), RequestModel = reqModel, ResponseModel = rspModel, ElapsedTime = sw.ElapsedMilliseconds, Code = interfaceName.GetHashCode(), InterfaceNameEnum = interfaceName, ProjectId = ProjectId.GetHashCode(), ResultCode = resultCode, Remark = ex != null ? string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()) : string.Empty, RowStatus = TrueOrFalseEnum.True.GetHashCode(), CreatedBy = CurrentUserId, CreatedOn = DateTime.Now, UpdatedBy = CommonHelp.ServiceIp, }); }
net core API 过滤器调用
/// <summary> /// api 日志跟踪类 /// </summary> public class ApiTrackerAttribute : ActionFilterAttribute { private string _prefix = "Tracker_"; /// <summary> /// 控制器方法执行之前执行此方法 /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var sw = new Stopwatch(); sw.Start(); context.HttpContext.Items.Add(_prefix + "params", context.ActionArguments);//请求开始实际带上 var executeStartTime = DateTime.Now; context.HttpContext.Items.Add(_prefix + "executeStartTime", executeStartTime.ToString("yyyy-MM-dd HH:mm:ss:ffff")); //context.HttpContext.Items.Add(_prefix + "executeStartTimeffff", executeStartTime.ToString("yyyy-MM-dd HH:mm:ss:ffff")); context.HttpContext.Items.Add(_prefix + "sw", sw); context.HttpContext.Items.Add(_prefix + "ControllerName", ((ControllerActionDescriptor)context.ActionDescriptor).ControllerName); context.HttpContext.Items.Add(_prefix + "ActionName", ((ControllerActionDescriptor)context.ActionDescriptor).ActionName); return base.OnActionExecutionAsync(context, next); } /// <summary> /// 控制器操作结果执行之前调用此方法 /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public override Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { WriteLogAsyncResult(context); return base.OnResultExecutionAsync(context, next); } /// <summary> /// 控制器操作结果执行之后调用此方法 /// </summary> /// <param name="context"></param> public override void OnActionExecuted(ActionExecutedContext context) { //WriteLogAsync(context); base.OnActionExecuted(context); } /// <summary> /// 写日志 /// </summary> /// <param name="actionContext"></param> /// <returns></returns> private bool WriteLogAsyncResult(ResultExecutingContext actionContext) { var isSucceed = false; var log = "0"; try { ObjectResult resultObj = null; if (actionContext.Result != null) { resultObj = actionContext.Result as Microsoft.AspNetCore.Mvc.ObjectResult; } //var resultJosn = JsonConvert.SerializeObject(resultObj.Value); log = "1"; var items = actionContext.HttpContext.Items; log = "2"; Stopwatch sw = null; if (items.ContainsKey(_prefix + "sw")) { sw = items[_prefix + "sw"] as Stopwatch; } log = "3"; var executeStartTimefffStr = string.Empty; if (items.ContainsKey(_prefix + "executeStartTime")) { executeStartTimefffStr = items[_prefix + "executeStartTime"].ToString(); } log = "4"; var executeStartTimeStr = string.Empty; var fffStr = string.Empty; var executeStartTime = DateTime.Now; if (!string.IsNullOrEmpty(executeStartTimefffStr)) { if (executeStartTimefffStr.Length >= 19) { executeStartTimeStr = executeStartTimefffStr.Substring(0, 19); } if (executeStartTimefffStr.Length >= 24) { log = "5"; fffStr = executeStartTimefffStr.Substring(20, 4); } executeStartTime = DateTime.Parse(executeStartTimeStr); } //log = "6"; var fffStr_int = fffStr.ToInt(); //log = "7"; var controllerName = string.Empty; if (items.ContainsKey(_prefix + "ControllerName")) { controllerName = items[_prefix + "ControllerName"].ToString(); } var method = string.Empty; if (items.ContainsKey(_prefix + "ActionName")) { method = items[_prefix + "ActionName"].ToString(); } //log = "8"; //var executeStartTime = DateTime.Parse(items[_prefix + "executeStartTime"].ToString()); //var executeStartTimefff = items[_prefix + "executeStartTimeffff"].ToString(); //executeStartTime.AddMilliseconds(fffStr.ToInt()); //var aa = 0; #region MyRegion //WebApiLogModel logModel = new WebApiLogModel(); //logModel.ExecuteStartTime = executeStartTime; //logModel.ExecuteEndTime = DateTime.Now; ////获取Action 参数 //logModel.ActionParams = new Dictionary<string, object>(actionContext.ActionArguments); //logModel.HttpRequestHeaders = actionContext.HttpContext.Request.Headers.ToString(); //logModel.HttpRequestPath = actionContext.HttpContext.Request.Path; //logModel.HttpMethod = actionContext.HttpContext.Request.Method; //logModel.ActionName = ((ControllerActionDescriptor)actionContext.ActionDescriptor).ActionName; //logModel.ControllerName = ((ControllerActionDescriptor)actionContext.ActionDescriptor).ControllerName; //logModel.TotalSeconds = (logModel.ExecuteEndTime - logModel.ExecuteStartTime).TotalSeconds; //logModel.IP = CommonHttpContext.Current.Connection.RemoteIpAddress.ToString(); #endregion IDictionary<string, object> actionArguments = null; if (items.ContainsKey(_prefix + "params")) { actionArguments = (IDictionary<string, object>)items[_prefix + "params"]; log = "9"; } var logModel = new ApiLogServiceModel() { Search1 = string.Empty, Search2 = string.Empty, ClassName = controllerName, Method = method, Type = ApiLogType.Common.GetHashCode(), RequestModel = actionArguments, ResponseModel = resultObj != null ? resultObj.Value : null, Code = 0, InterfaceNameEnum = InterfaceName.All, ProjectId = ProjectIdEnum.LDApi.GetHashCode(), ResultCode = 200, ExecuteStartTime = executeStartTime,//DateTime.Parse(items[_prefix + "executeStartTime"].ToString()), ExecuteEndTime = DateTime.Now, Remark = string.Empty, RowStatus = TrueOrFalseEnum.True.GetHashCode(), CreatedBy = CommonHelp.ServiceIp,//CommonHttpContext.Current.Connection.RemoteIpAddress.ToString(), CreatedOn = DateTime.Now, UpdatedBy = CommonHelp.ServiceIp }; log = "10"; var totalMilliseconds = (logModel.ExecuteEndTime - logModel.ExecuteStartTime).TotalMilliseconds; log = "11"; if ((totalMilliseconds - fffStr_int) >= 0) { logModel.TimeDifference = totalMilliseconds - fffStr_int; } else { logModel.TimeDifference = totalMilliseconds; } log = "12"; logModel.Remark = string.Format("ExecuteStartTime:{0},executeStartTimefff:{1},ExecuteEndTime:{2},fffStr:{3}", executeStartTime.ToString("yyyy-MM-dd HH:mm:ss:fffff"), executeStartTimefffStr, logModel.ExecuteEndTime.ToString("yyyy-MM-dd HH:mm:ss:fffff"), fffStr); log = "13"; if (sw != null) { sw.Stop(); log = "14"; logModel.ElapsedTime = sw.ElapsedMilliseconds; } log = "15"; ApiLogQueueService.Instance.Enqueue(logModel); log = "16"; isSucceed = true; log = "17"; } catch (Exception ex) { var logModel = new ApiLogServiceModel() { Search1 = string.Empty, Search2 = string.Empty, ClassName = "ApiTrackerAttribute", Method = "WriteLogAsync", Type = ApiLogType.Error.GetHashCode(), RequestModel = null, RequestData = String.Format("log:{0}", log), ResponseModel = null, ElapsedTime = 0, Code = 0, InterfaceNameEnum = InterfaceName.All, ProjectId = ProjectIdEnum.LDApi.GetHashCode(), ResultCode = 0, TimeDifference = 0, ExecuteStartTime = SystemConst.DateTimeDefault, ExecuteEndTime = SystemConst.DateTimeDefault, Remark = string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()), RowStatus = TrueOrFalseEnum.True.GetHashCode(), CreatedBy = CommonHelp.ServiceIp, CreatedOn = DateTime.Now, UpdatedBy = CommonHelp.ServiceIp, }; ApiLogQueueService.Instance.Enqueue(logModel); } return isSucceed; } /// <summary> /// 写日志 /// </summary> /// <param name="actionContext"></param> /// <returns></returns> private async Task WriteLogAsync(ActionExecutedContext actionContext) { try { var items = actionContext.HttpContext.Items; var sw = items[_prefix + "sw"] as Stopwatch; var executeStartTime = DateTime.Parse(items[_prefix + "executeStartTime"].ToString()); #region MyRegion //WebApiLogModel logModel = new WebApiLogModel(); //logModel.ExecuteStartTime = executeStartTime; //logModel.ExecuteEndTime = DateTime.Now; ////获取Action 参数 //logModel.ActionParams = new Dictionary<string, object>(actionContext.ActionArguments); //logModel.HttpRequestHeaders = actionContext.HttpContext.Request.Headers.ToString(); //logModel.HttpRequestPath = actionContext.HttpContext.Request.Path; //logModel.HttpMethod = actionContext.HttpContext.Request.Method; //logModel.ActionName = ((ControllerActionDescriptor)actionContext.ActionDescriptor).ActionName; //logModel.ControllerName = ((ControllerActionDescriptor)actionContext.ActionDescriptor).ControllerName; //logModel.TotalSeconds = (logModel.ExecuteEndTime - logModel.ExecuteStartTime).TotalSeconds; //logModel.IP = CommonHttpContext.Current.Connection.RemoteIpAddress.ToString(); #endregion IDictionary<string, object> actionArguments = null; if (items.ContainsKey(_prefix + "params")) { actionArguments = (IDictionary<string, object>)items[_prefix + "params"]; } var logModel = new ApiLogServiceModel() { Search1 = string.Empty, Search2 = string.Empty, ClassName = items[_prefix + "ControllerName"].ToString(), Method = items[_prefix + "ActionName"].ToString(), Type = ApiLogType.Common.GetHashCode(), RequestModel = actionArguments, ResponseModel = null, Code = 0, InterfaceNameEnum = InterfaceName.All, ProjectId = ProjectIdEnum.LDApi.GetHashCode(), ResultCode = 200, ExecuteStartTime = executeStartTime,//DateTime.Parse(items[_prefix + "executeStartTime"].ToString()), ExecuteEndTime = DateTime.Now, Remark = string.Empty, RowStatus = TrueOrFalseEnum.True.GetHashCode(), CreatedBy = CommonHelp.ServiceIp,//CommonHttpContext.Current.Connection.RemoteIpAddress.ToString(), CreatedOn = DateTime.Now, UpdatedBy = CommonHelp.ServiceIp }; logModel.TimeDifference = (logModel.ExecuteEndTime - logModel.ExecuteStartTime).TotalMilliseconds; logModel.Remark = string.Format("ExecuteStartTime:{0},ExecuteEndTime:{1}", executeStartTime.ToString("yyyy-MM-dd HH:mm:ss:fffff"), logModel.ExecuteEndTime.ToString("yyyy-MM-dd HH:mm:ss:fffff")); sw.Stop(); logModel.ElapsedTime = sw.ElapsedMilliseconds; ApiLogQueueService.Instance.Enqueue(logModel); } catch (Exception ex) { var logModel = new ApiLogServiceModel() { Search1 = string.Empty, Search2 = string.Empty, ClassName = "ApiTrackerAttribute", Method = "WriteLogAsync", Type = ApiLogType.Error.GetHashCode(), RequestModel = string.Empty, ResponseModel = null, ElapsedTime = 0, Code = 0, InterfaceNameEnum = InterfaceName.All, ProjectId = ProjectIdEnum.LDApi.GetHashCode(), ResultCode = 0, TimeDifference = 0, ExecuteStartTime = SystemConst.DateTimeDefault, ExecuteEndTime = SystemConst.DateTimeDefault, Remark = string.Format("errorMsg:{0},Exception:{1}", ex.Message, ex.ToString()), RowStatus = TrueOrFalseEnum.True.GetHashCode(), CreatedBy = CommonHelper.CommonHelp.ServiceIp, CreatedOn = DateTime.Now }; ApiLogQueueService.Instance.Enqueue(logModel); } } }
配置服务
public void ConfigureServices(IServiceCollection services) { //在startup的ConfigureServices中设置或禁用WebApiExceptionFilterAttribute或WebApiTrackerAttribute services.AddControllers(ops => { ops.Filters.Add(new ApiExceptionFilterAttribute()); ops.Filters.Add(new ApiTrackerAttribute()); }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0); }