Esempio n. 1
0
        public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)
        {
            if (controllerContext == null)
            {
                throw new ArgumentNullException("controllerContext");
            }
            if (string.IsNullOrEmpty(actionName))
            {
                throw new ArgumentException("动作名称为null", "actionName");
            }
            ControllerDescriptor controllerDescriptor = this.GetControllerDescriptor(controllerContext);
            ActionDescriptor     actionDescriptor     = this.FindAction(controllerContext, controllerDescriptor, actionName);

            if (actionDescriptor != null)
            {
                FilterInfo filters = this.GetFilters(controllerContext, actionDescriptor);
                try
                {
                    AuthorizationContext authorizationContext = this.InvokeAuthorizationFilters(controllerContext, filters.AuthorizationFilters, actionDescriptor);
                    if (authorizationContext.Result != null)
                    {
                        this.InvokeActionResult(controllerContext, authorizationContext.Result);
                    }
                    else
                    {
                        if (controllerContext.Controller.ValidateRequest)
                        {
                            ControllerActionInvoker.ValidateRequest(controllerContext);
                        }
                        IDictionary <string, object> parameterValues       = this.GetParameterValues(controllerContext, actionDescriptor);
                        ActionExecutedContext        actionExecutedContext = this.InvokeActionMethodWithFilters(controllerContext, filters.ActionFilters, actionDescriptor, parameterValues);
                        this.InvokeActionResultWithFilters(controllerContext, filters.ResultFilters, actionExecutedContext.Result);
                    }
                }
                catch (ThreadAbortException)
                {
                    throw;
                }
                catch (Exception exception)
                {
                    ExceptionContext exceptionContext = this.InvokeExceptionFilters(controllerContext, filters.ExceptionFilters, exception);
                    if (!exceptionContext.ExceptionHandled)
                    {
                        throw;
                    }
                    this.InvokeActionResult(controllerContext, exceptionContext.Result);
                }
                return(true);
            }
            return(false);
        }
Esempio n. 2
0
        /// <summary>
        /// 执行请求结果的筛选器
        /// </summary>
        /// <param name="controllerContext"></param>
        /// <param name="filters"></param>
        /// <param name="actionResult"></param>
        /// <returns></returns>
        protected virtual ResultExecutedContext InvokeActionResultWithFilters(ControllerContext controllerContext, IList <IResultFilter> filters, ActionResult actionResult)
        {
            ResultExecutingContext       preContext = new ResultExecutingContext(controllerContext, actionResult);
            Func <ResultExecutedContext> seed       = delegate
            {
                this.InvokeActionResult(controllerContext, actionResult);
                return(new ResultExecutedContext(controllerContext, actionResult, false, null));
            };
            Func <ResultExecutedContext> func = filters.Reverse <IResultFilter>().Aggregate(seed,
                                                                                            (Func <ResultExecutedContext> next, IResultFilter filter) =>
                                                                                            () =>
                                                                                            ControllerActionInvoker.InvokeActionResultFilter(filter, preContext, next));

            return(func());
        }
Esempio n. 3
0
        /// <summary>
        /// 执行请求方法的筛选器
        /// </summary>
        /// <param name="controllerContext"></param>
        /// <param name="filters"></param>
        /// <param name="actionDescriptor"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        protected virtual ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList <IActionFilter> filters, ActionDescriptor actionDescriptor, IDictionary <string, object> parameters)
        {
            ActionExecutingContext       preContext = new ActionExecutingContext(controllerContext, actionDescriptor, parameters);
            Func <ActionExecutedContext> seed       = () => new ActionExecutedContext(controllerContext, actionDescriptor, false, null)
            {
                Result = this.InvokeActionMethod(controllerContext, actionDescriptor, parameters)
            };
            Func <ActionExecutedContext> func = filters.Reverse <IActionFilter>().Aggregate(seed
                                                                                            , (Func <ActionExecutedContext> next, IActionFilter filter) =>
                                                                                            () =>
                                                                                            ControllerActionInvoker.InvokeActionMethodFilter(filter, preContext, next));

            return(func());
        }