Пример #1
0
        /// <summary>
        /// StartAsync
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task <ImageResult> StartAsync(ProcessingPipelineContext context)
        {
            using (FilterContext filterContext = CreateFilterContext(context))
            {
                //execute filters
                while (filterContext.ProcessingContext.UrlFilters.Count > 0)
                {
                    string filter = filterContext.ProcessingContext.UrlFilters.Peek();

                    //find and execute filter
                    IFilterAction foundFilter = FilterActions.FirstOrDefault(x => x.TryExecute(filter, filterContext));

                    if (foundFilter != null)
                    {
                        Logger.LogTrace("Filter executed: " + filter);

                        filterContext.ProcessingContext.UrlFilters.Dequeue();
                    }
                    else
                    {
                        Logger.LogTrace($"filter was not found: {filter}");

                        throw new Exception($"Filter was not found: {filter}");

                        //return false;
                    }

                    //stop processing?
                    if (filterContext.Result != null)
                    {
                        return(filterContext.Result);
                    }
                }

                return(await filterContext.BuildResultAsync());
            }
        }
Пример #2
0
        /// <summary>
        /// AddFilter
        /// </summary>
        /// <typeparam name="TFilter"></typeparam>
        public void AddFilter <TFilter>()
            where TFilter : TFilterBase
        {
            MethodInfo[] methods = typeof(TFilter)
                                   .GetMethods()
                                   .Where(x => x.IsPublic)
                                   .Where(x => x.GetCustomAttribute <FilterAttribute>() != null)
                                   .ToArray();

            foreach (MethodInfo method in methods)
            {
                ParameterInfo[] parameters = method.GetParameters();

                Type[] integerTypes        = new Type[] { typeof(byte), typeof(short), typeof(int), typeof(long) };
                Type[] floatingNumberTypes = new Type[] { typeof(float), typeof(double), typeof(decimal) };

                ParameterItem CreateParameter(ParameterInfo pi, string pattern)
                {
                    return(new ParameterItem()
                    {
                        Name = pi.Name, Pattern = $@"(?<{pi.Name}>{pattern})"
                    });
                }

                List <ParameterItem> pp = new List <ParameterItem>();

                for (int i = 0; i < parameters.Length; i++)
                {
                    ParameterInfo currentParameter = parameters[i];

                    if (integerTypes.Any(x => x == currentParameter.ParameterType))
                    {
                        pp.Add(CreateParameter(currentParameter, @"-?\d+"));
                    }
                    else if (floatingNumberTypes.Any(x => x == currentParameter.ParameterType))
                    {
                        pp.Add(CreateParameter(currentParameter, @"-?\d+\.\d+"));
                    }
                    else if (currentParameter.ParameterType == typeof(bool))
                    {
                        pp.Add(CreateParameter(parameters[i], "True|False"));
                    }
                    else if (currentParameter.ParameterType == typeof(string))
                    {
                        ParameterItem p = CreateParameter(parameters[i], "[^']*");

                        p.Pattern = $"'{p.Pattern}'";

                        pp.Add(p);
                    }
                    else if (currentParameter.ParameterType.IsEnum)
                    {
                        //@"[a-z]{1}[a-z0-9]*"

                        string[] enumValues = Enum.GetNames(parameters[i].ParameterType)
                                              .Select(x => x.ToLower())
                                              .ToArray();

                        pp.Add(CreateParameter(parameters[i], string.Join("|", enumValues)));
                    }
                    else
                    {
                        throw new Exception("parameter type is not supported: " + parameters[i].ParameterType.Name);
                    }
                }

                StringBuilder builder = new StringBuilder("^");

                //function begin
                builder.Append($@"{method.Name.ToLowerInvariant()}\(");

                bool optionalParmeterCall = parameters.All(x => (x.DefaultValue is DBNull) == false);

                if (optionalParmeterCall)
                {
                    //add optional parameters
                    builder.Append($"(,|{string.Join("|", pp.Select(x => $"({x.Name}={x.Pattern})").ToArray())})*");
                }
                else
                {
                    //add all parameters
                    builder.Append(string.Join(",", pp.Select(x => x.Pattern).ToArray()));
                }

                //function end
                builder.Append(@"\)$");

                IFilterAction filterAction = CreateFilterAction <TFilter>(new Regex(builder.ToString(), RegexOptions.Compiled), method);

                FilterActions.Add(filterAction);
            }
        }