public IActionResult Index(int Id, bool ajax) { ViewData["Id"] = Id; ViewData["ajax"] = ajax; // Статистика запросов за прошлую минуту if (!memoryCache.TryGetValue(KeyToMemoryCache.IspNumberOfRequestToMinutes(DateTime.Now.AddMinutes(-1)), out IDictionary <string, NumberOfRequestMinute> NumberOfRequestsPerMinute)) { NumberOfRequestsPerMinute = new Dictionary <string, NumberOfRequestMinute>(); } // Настройки домена var domain = FindAndInclude(coreDB.RequestsFilter_Domains.AsNoTracking(), Id); ViewBag.host = domain.host; // Список алиасов List <AliasView> Aliases = new List <AliasView>(); // Alias To AliasView foreach (var alias in domain.Aliases) { // Base Alias var model = new AliasView() { DomainId = alias.DomainId, Folder = alias.Folder, host = alias.host, Id = alias.Id }; // Количество запросов для алиаса if (NumberOfRequestsPerMinute.TryGetValue(alias.host, out NumberOfRequestMinute dt)) { model.ReqToMinute = dt.NumberOfRequest; } Aliases.Add(model); } // Выводим результат return(View("~/Views/RequestsFilter/Domain/Aliases.cshtml", Aliases.OrderByDescending(i => i.ReqToMinute))); }
public IActionResult Index(bool ajax, int page = 1, string search = null, string sort = null) { int pageSize = 12; #region Локальный метод - NavPageSize int NavPageSize() { int x = (page % 5); if (x == 0) { return(pageSize + 1); } return((pageSize * (5 - x)) + 1); } #endregion #region Статистика запросов за прошлую минуту Dictionary <int, ulong> numberOfRequestsPerMinute = new Dictionary <int, ulong>(); { if (memoryCache.TryGetValue(KeyToMemoryCache.IspNumberOfRequestToMinutes(DateTime.Now.AddMinutes(-1)), out IDictionary <string, NumberOfRequestMinute> data)) { foreach (var dt in data) { if (numberOfRequestsPerMinute.TryGetValue(dt.Value.DomainID, out ulong item)) { numberOfRequestsPerMinute[dt.Value.DomainID] = item + dt.Value.NumberOfRequest; } else { numberOfRequestsPerMinute.Add(dt.Value.DomainID, dt.Value.NumberOfRequest); } } #region Сортируем массив if (sort == "req") { numberOfRequestsPerMinute = numberOfRequestsPerMinute.OrderByDescending(i => i.Value).Skip((page * pageSize) - pageSize).Take(NavPageSize()).ToDictionary(i => i.Key, i => i.Value); } else { numberOfRequestsPerMinute = numberOfRequestsPerMinute.OrderByDescending(i => i.Value).ToDictionary(i => i.Key, i => i.Value); } #endregion } } #endregion // Поиск / Сортировка Func <Domain, bool> predicat = i => search == null || i.host.Contains(search); if (sort == "req") { predicat = i => numberOfRequestsPerMinute.ContainsKey(i.Id); } // Список доменов List <DomainView> domains = new List <DomainView>(); // Domain To DomainView foreach (var domain in coreDB.RequestsFilter_Domains.AsNoTracking().Include(t => t.Templates).AsEnumerable().Where(predicat).Reverse().Skip((page * pageSize) - pageSize).Take(NavPageSize())) { var model = new DomainView() { Id = domain.Id, host = domain.host, Protect = domain.Protect }; /// Количество запросов за прошлую минуту if (numberOfRequestsPerMinute.TryGetValue(domain.Id, out ulong ReqToMinute)) { model.ReqToMinute = ReqToMinute; } #region Имена шаблонов StringBuilder TemplateName = new StringBuilder(); foreach (var tpl in domain.Templates) { TemplateName.Append(coreDB.RequestsFilter_Templates.GetTemplateName(tpl.Template, "") + ", "); } model.Templates = Regex.Replace(TemplateName.ToString(), ",([ ]+)?$", ""); #endregion // Модель domains.Add(model); } // Дополнительная информация ViewBag.Info = page == 1 && search == null && sort == null ? "У вас еще нет добавленных доменов" : "Нет данных для вывода"; // Сортировка по "req/s" if (sort == "req") { return(View("~/Views/RequestsFilter/Domains.cshtml", new NavPage <DomainView>(domains.OrderByDescending(i => i.ReqToMinute).ToList(), HttpContext, pageSize, page, overrideMass: true), ajax)); } // Базовая сортировка return(View("~/Views/RequestsFilter/Domains.cshtml", new NavPage <DomainView>(domains, HttpContext, pageSize, page, overrideMass: true), ajax)); }
public static void SetCountRequestToMinute(string IP, TypeRequest type, string host, int DomainID, bool EnableCountRequest) { if (type != TypeRequest.All && type != TypeRequest._303) { return; } #region Локальный метод - "SetCount" void SetCount(NumberOfRequestMinute dt) { switch (type) { case TypeRequest._303: dt.Count303++; Trigger.OnRequestToMinute((IP, type, dt.Count303, host, DomainID)); break; case TypeRequest.All: dt.NumberOfRequest++; Trigger.OnRequestToMinute((IP, type, dt.NumberOfRequest, host, DomainID)); break; } } #endregion if (EnableCountRequest) { string keyNumberOfRequestToMinutes = KeyToMemoryCache.IspNumberOfRequestToMinutes(DateTime.Now); if (memoryCache.TryGetValue(keyNumberOfRequestToMinutes, out IDictionary <string, NumberOfRequestMinute> NumberOfRequestsPerMinute)) { // Если хост есть в кеше if (NumberOfRequestsPerMinute.TryGetValue(host, out NumberOfRequestMinute dtValue)) { SetCount(dtValue); } // Если хоста нету в кеше else { var dt = new NumberOfRequestMinute(); dt.DomainID = DomainID; SetCount(dt); NumberOfRequestsPerMinute.Add(host, dt); } } else { // Считаем запрос var dt = new NumberOfRequestMinute(); dt.DomainID = DomainID; SetCount(dt); // Создаем кеш memoryCache.Set(keyNumberOfRequestToMinutes, new Dictionary <string, NumberOfRequestMinute>() { [host] = dt }, TimeSpan.FromMinutes(3)); } } }