public override void OnActionExecuting(ActionExecutingContext context)
        {
            var logger   = context.HttpContext.RequestServices.GetService(typeof(ILogger <ValidatePaginationAttribute>)) as ILogger <ValidatePaginationAttribute>;
            var ioptions = context.HttpContext.RequestServices.GetService(typeof(IOptions <NexusatAspNetCoreOptions>)) as IOptions <NexusatAspNetCoreOptions>;
            var options  = ioptions.Value;

            int?p_size, p_index;

            ParsePageCursor(options, context.HttpContext.Request.Query, out p_size, out p_index);

            // Evaluate if blocking a pagesize outofrange exception
            if (ReturnBadRequestOnOutOfRange ?? options.PaginationDefaultBadRequestOnPageSizeOutOfRange)
            {
                var maxPageSize = MaxPageSize != -1 ? MaxPageSize : options.PaginationDefaultMaxPageSize;
                logger.LogDebug("MaxPageSize allowed: {0}", maxPageSize);

                if (maxPageSize > 0 && p_size.HasValue && p_size.Value > maxPageSize)
                {
                    var ex = new BadRequest.Exception("KO_PAGE_SIZE_OUT_OF_RANGE");
                    ex.Description = FormatSystemMessage("Page Size {0} is greather than the maximum allowed ({1})", p_size.Value, maxPageSize);
                    throw ex;
                }
            }

            int actual_p_index = p_index ?? 1;
            int actual_p_size  = p_size ?? (DefaultPageSize != -1 ? DefaultPageSize : options.PaginationDefaultPageSize);

            logger.LogDebug("Actual page cursor: Index({0}), Size({1})", actual_p_size, actual_p_size);

            // Set Pagination Cursor for the current request
            context.HttpContext.Items[InternalConstants.PaginationCursorKey] = new PaginationCursor(actual_p_index, actual_p_size);
        }
        private static void ParsePageCursor(NexusatAspNetCoreOptions options, IQueryCollection query, out int?pageSize, out int?pageIndex)
        {
            StringValues values;

            pageSize = pageIndex = null;
            int _size, _index;

            if (query.TryGetValue(options.PaginationPageSizeName, out values))
            {
                if (!int.TryParse(values[0], out _size))
                {
                    var ex = new BadRequest.Exception("KO_BAD_PAGE_SIZE");
                    ex.Description = "Page Size is not a valid integer";
                    throw ex;
                }
                if (_size < 0)
                {
                    var ex = new BadRequest.Exception("KO_BAD_PAGE_SIZE");
                    ex.Description = "Page Size must be a non negative integer";
                    throw ex;
                }
                pageSize = _size;
            }
            if (query.TryGetValue(options.PaginationPageIndexName, out values))
            {
                if (!int.TryParse(values[0], out _index))
                {
                    var ex = new BadRequest.Exception("KO_BAD_PAGE_INDEX");
                    ex.Description = "Page Index is not a valid integer";
                    throw ex;
                }
                if (_index < 1)
                {
                    var ex = new BadRequest.Exception("KO_BAD_PAGE_INDEX");
                    ex.Description = "Page Index must be a positive integer";
                    throw ex;
                }

                pageIndex = _index;
            }
        }