示例#1
0
        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)));
        }
示例#2
0
        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));
        }
示例#3
0
        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));
                }
            }
        }