public override void OnActionExecuting(ActionExecutingContext filterContext) { HttpContextBase httpContextBase = filterContext.HttpContext; HttpRequestBase request = httpContextBase.Request; HttpResponseBase response = httpContextBase.Response; string operKey = request.UserHostAddress + request.Path.ToLower(); OperRecord operRecord = null; lock (RecordMap) { if (RecordMap.ContainsKey(operKey)) { operRecord = RecordMap[operKey]; long totalMilliseconds = Convert.ToInt64((DateTime.Now - operRecord.LastOperDate).TotalMilliseconds); int count = Convert.ToInt32((totalMilliseconds - totalMilliseconds % ClearMillisecond) / ClearMillisecond); operRecord.Count = operRecord.Count > count ? operRecord.Count - count : 0; } else { RecordMap.Add(operKey, operRecord = new OperRecord { Count = 1, OperKey = operKey, LastOperDate = DateTime.Now }); } } if (operRecord.Count >= CountLimit) { response.ContentEncoding = Encoding.UTF8; response.ContentType = "application/json;charset=UTF-8"; response.StatusCode = 200; response.Write(JsonConvert.SerializeObject(new Result { code = -1, msg = "操作过于频繁、请稍后重试!", })); filterContext.Result = new EmptyResult(); } else { lock (RecordMap) { operRecord.Count++; operRecord.LastOperDate = DateTime.Now; } base.OnActionExecuting(filterContext); } if ((DateTime.Now - LastClearDate).TotalSeconds > 60) { lock (RecordMap) { long sumMillisecond = ClearMillisecond * CountLimit; foreach (string tkey in new HashSet <string>(RecordMap.Keys)) { if (tkey.EndsWith(request.Path)) { operRecord = RecordMap[tkey]; long totalMilliseconds = Convert.ToInt64((DateTime.Now - operRecord.LastOperDate).TotalMilliseconds); if (totalMilliseconds >= sumMillisecond) { RecordMap.Remove(tkey); } } } } LastClearDate = DateTime.Now; } }
public override void OnActionExecuting(ActionExecutingContext filterContext) { HttpContextBase httpContextBase = filterContext.HttpContext; HttpRequestBase request = httpContextBase.Request; string key = request.UserHostAddress + request.Path.ToLower(); bool temp = true; lock (RecordMap) { if (RecordMap.ContainsKey(key)) { temp = (DateTime.Now - RecordMap[key]).TotalMilliseconds > IntervalMillisecond; } else { RecordMap.Add(key, DateTime.Now); } } if (temp) { lock (RecordMap) { if (RecordMap.ContainsKey(key)) { RecordMap[key] = DateTime.Now; } else { RecordMap.Add(key, DateTime.Now); } } base.OnActionExecuting(filterContext); } else { HttpResponseBase response = httpContextBase.Response; response.ContentEncoding = Encoding.UTF8; response.ContentType = "application/json;charset=UTF-8"; response.StatusCode = 200; response.Write(JsonConvert.SerializeObject(new Result { code = -1, msg = "操作过于频繁、请稍后重试!", })); filterContext.Result = new EmptyResult(); } if ((DateTime.Now - LastClearDate).TotalSeconds > 60) { lock (RecordMap) { foreach (string tkey in new HashSet <string>(RecordMap.Keys)) { if (tkey.EndsWith(request.Path) && RecordMap.ContainsKey(tkey) && (DateTime.Now - RecordMap[tkey]).TotalMilliseconds > IntervalMillisecond) { RecordMap.Remove(tkey); } } } LastClearDate = DateTime.Now; } }