Ejemplo n.º 1
0
        /// <summary>
        /// 根据一个Action的调用信息(类名与方法名),返回内部表示的调用信息。
        /// </summary>
        /// <param name="pair"></param>
        /// <returns></returns>
        public static InvokeInfo GetActionInvokeInfo(ControllerActionPair pair, HttpRequest request)
        {
            if (pair == null)
            {
                throw new ArgumentNullException("pair");
            }

            InvokeInfo vkInfo = new InvokeInfo();

            vkInfo.Controller = GetServiceController(pair.Controller);
            if (vkInfo.Controller == null)
            {
                return(null);
            }

            vkInfo.Action = GetServiceAction(vkInfo.Controller.ControllerType, pair.Action, request);
            if (vkInfo.Action == null)
            {
                return(null);
            }

            if (vkInfo.Action.MethodInfo.IsStatic == false)
            {
                //vkInfo.Instance = Activator.CreateInstance(vkInfo.Controller.ControllerType);
                vkInfo.Instance = vkInfo.Controller.ControllerType.FastNew();
            }

            return(vkInfo);
        }
Ejemplo n.º 2
0
        IHttpHandler IHttpHandlerFactory.GetHandler(HttpContext context,
                                                    string requestType, string virtualPath, string physicalPath)
        {
            // 说明:这里不使用virtualPath变量,因为不同的配置,这个变量的值会不一样。
            // 例如:/mvc/*/*.aspx 和 /mvc/*
            // 为了映射HTTP处理器,下面直接使用context.Request.Path

            string requestPath = context.Request.Path;
            string vPath       = UrlHelper.GetRealVirtualPath(context, requestPath);

            // 尝试根据请求路径获取Action
            InvokeInfo vkInfo = ReflectionHelper.GetActionInvokeInfo(vPath);

            // 如果没有找到合适的Action,并且请求的是一个ASPX页面,则按ASP.NET默认的方式来继续处理
            if (vkInfo == null && requestPath.EndsWith(".aspx", StringComparison.OrdinalIgnoreCase))
            {
                if (_msPageHandlerFactory == null)
                {
                    _msPageHandlerFactory = new AspnetPageHandlerFactory();
                }

                // 调用ASP.NET默认的Page处理器工厂来处理
                return(_msPageHandlerFactory.GetHandler(context, requestType, requestPath, physicalPath));
            }

            return(ActionHandler.CreateHandler(vkInfo));
        }
        public IHttpHandler GetHandler(HttpContext context,
                                       string requestType, string virtualPath, string physicalPath)
        {
            // 说明:这里不使用virtualPath变量,因为不同的配置,这个变量的值会不一样。
            // 例如:/Ajax/*/*.aspx 和 /Ajax/*
            // 为了映射HTTP处理器,下面直接使用context.Request.Path

            string vPath = UrlHelper.GetRealVirtualPath(context, context.Request.Path);

            // 根据请求路径,定位到要执行的Action
            ControllerActionPair pair = ParseUrl(context, vPath);

            if (pair == null)
            {
                ExceptionHelper.Throw404Exception(context);
            }

            // 获取内部表示的调用信息
            InvokeInfo vkInfo = ReflectionHelper.GetActionInvokeInfo(pair, context.Request);

            if (vkInfo == null)
            {
                ExceptionHelper.Throw404Exception(context);
            }

            // 创建能够调用Action的HttpHandler
            return(ActionHandler.CreateHandler(vkInfo));
        }
Ejemplo n.º 4
0
        public static void TrySetPageModel(HttpContext context)
        {
            if (context == null || context.Handler == null)
            {
                return;
            }

            IHttpHandler handler = context.Handler;

            // 判断当前处理器是否从MyPageView<TModel>继承过来
            Type handlerType = handler.GetType().BaseType;

            if (handlerType.IsGenericType &&
                handlerType.GetGenericTypeDefinition() == MyPageViewOpenType)
            {
                // 查找能响应这个请求的Action,并获取视图数据。
                InvokeInfo vkInfo = ReflectionHelper.GetActionInvokeInfo(context.Request.FilePath);
                if (vkInfo == null)
                {
                    return;
                }


                object model = ActionExecutor.ExecuteActionInternal(context, vkInfo);

                // 设置页面Model
                SetPageModel(context.Handler, model);
            }
        }
Ejemplo n.º 5
0
        public static ActionHandler CreateHandler(InvokeInfo vkInfo)
        {
            SessionMode mode = vkInfo.GetSessionMode();

            if (mode == SessionMode.NotSupport)
            {
                return new ActionHandler {
                           InvokeInfo = vkInfo
                }
            }
            ;

            else if (mode == SessionMode.ReadOnly)
            {
                return new ReadOnlySessionActionHandler {
                           InvokeInfo = vkInfo
                }
            }
            ;

            else
            {
                return new RequiresSessionActionHandler {
                           InvokeInfo = vkInfo
                }
            };
        }
    }
Ejemplo n.º 6
0
        internal static void ExecuteAction(HttpContext context, InvokeInfo vkInfo)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (vkInfo == null)
            {
                throw new ArgumentNullException("vkInfo");
            }

            SetMvcVersionHeader(context);

            LogAttribute logAttr = vkInfo.GetLogAttribute();

            if (logAttr != null)
            {
                logAttr.Log(context);
            }


            // 验证请求是否允许访问(身份验证)
            AuthorizeAttribute authorize = vkInfo.GetAuthorize();

            if (authorize != null)
            {
                if (authorize.AuthenticateRequest(context) == false)
                {
                    throw new PermissionDeniedException();
                }
                //ExceptionHelper.Throw403Exception(context);
            }

            // ASP.NET的安全检查
            if (vkInfo.Action.Attr.NeedValidateRequest())
            {
                context.Request.ValidateInput();
            }


            // 调用方法
            object result = ExecuteActionInternal(context, vkInfo);

            // 设置OutputCache
            OutputCacheAttribute outputCache = vkInfo.GetOutputCacheSetting();

            if (outputCache != null)
            {
                outputCache.SetResponseCache(context);
            }


            // 处理方法的返回结果
            OutputActionResult(context, result);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 尝试根据当前请求,获取一个有效的Action,并返回ActionHandler
        /// 此方法可以在HttpModule中使用,用于替代httpHandler的映射配置
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public static IHttpHandler TryGetHandler(HttpContext context)
        {
            string vPath = UrlHelper.GetRealVirtualPath(context, context.Request.FilePath);

            InvokeInfo vkInfo = ReflectionHelper.GetActionInvokeInfo(vPath);

            if (vkInfo == null)
            {
                return(null);
            }

            return(ActionHandler.CreateHandler(vkInfo));
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 根据一个页面请求路径,返回内部表示的调用信息。
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static InvokeInfo GetActionInvokeInfo(string url)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }

            MatchActionDescription md     = null;
            ActionDescription      action = null;

            // 先直接用URL从字典中查找匹配项。
            if (s_PageActionDict.TryGetValue(url, out action) == false)
            {
                // 如果不能直接匹配URL,就用正则表达式再逐个匹配。
                md = GetActionUsingRegex(url);
                if (md == null)
                {
                    return(null);
                }
                else
                {
                    action = md.ActionDescription;
                }
            }

            InvokeInfo vkInfo = new InvokeInfo();

            vkInfo.Controller = action.PageController;
            vkInfo.Action     = action;

            if (md != null)
            {
                vkInfo.RegexMatch = md.Match;
            }

            if (vkInfo.Action.MethodInfo.IsStatic == false)
            {
                //vkInfo.Instance = Activator.CreateInstance(vkInfo.Controller.ControllerType);
                vkInfo.Instance = vkInfo.Controller.ControllerType.FastNew();
            }

            return(vkInfo);
        }
Ejemplo n.º 9
0
        internal static object ExecuteActionInternal(HttpContext context, InvokeInfo info)
        {
            // 准备要传给调用方法的参数
            object[] parameters = GetActionCallParameters(context, info.Action);

            // 调用方法
            if (info.Action.HasReturn)
            {
                //return info.Action.MethodInfo.Invoke(info.Instance, parameters);
                return(info.Action.MethodInfo.FastInvoke(info.Instance, parameters));
            }

            else
            {
                //info.Action.MethodInfo.Invoke(info.Instance, parameters);
                info.Action.MethodInfo.FastInvoke(info.Instance, parameters);
                return(null);
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 获取当前执行的Action信息
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public BehaviorActionInfo GetActionInfo(HttpContext context)
        {
            bool isAjaxRequest        = string.Compare(context.Request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.OrdinalIgnoreCase) == 0;
            BehaviorActionInfo action = new BehaviorActionInfo();
            InvokeInfo         vkInfo = null;

            if (isAjaxRequest)
            {
                string vPath = UrlHelper.GetRealVirtualPath(context, context.Request.Path);

                ControllerActionPair pair = new AjaxHandlerFactory().ParseUrl(context, vPath);
                if (pair == null)
                {
                    ExceptionHelper.Throw404Exception(context);
                }

                // 获取内部表示的调用信息
                vkInfo = ReflectionHelper.GetActionInvokeInfo(pair, context.Request);
            }
            else
            {
                string requestPath = context.Request.Path;
                string vPath       = UrlHelper.GetRealVirtualPath(context, requestPath);
                // 尝试根据请求路径获取Action
                vkInfo = ReflectionHelper.GetActionInvokeInfo(vPath);
            }
            if (vkInfo != null)
            {
                action.ActionName     = vkInfo.Action.MethodInfo.Name;
                action.ControllerName = vkInfo.Controller.ControllerType.Name;

                object[] Values = ActionParametersProviderFactory.CreateActionParametersProvider(context).GetParameters(context, vkInfo.Action);


                for (int i = 0; i < vkInfo.Action.Parameters.Length; i++)
                {
                    action.Parameters.Add(new { Name = vkInfo.Action.Parameters[i].Name, Value = Values[i] });
                }
            }
            return(action);
        }