Esempio n. 1
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
                }
            };
        }
    }
Esempio n. 2
0
        /// <summary>
        /// 根据一个页面请求路径,返回内部表示的调用信息。
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static InvokeInfo GetActionInvokeInfo(string url)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }

            ActionDescription action = null;

            if (s_PageActionDict.TryGetValue(url, out action) == false)
            {
                return(null);
            }

            InvokeInfo vkInfo = new InvokeInfo();

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

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

            return(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));
        }
Esempio 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);
            }
        }
Esempio n. 5
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);
        }
Esempio n. 6
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 };
        }
Esempio n. 7
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);

            // 验证请求是否允许访问(身份验证)
            AuthorizeAttribute authorize = vkInfo.GetAuthorize();
            if (authorize != null)
            {
                if (authorize.AuthenticateRequest(context) == false)
                    ExceptionHelper.Throw403Exception(context);
            }

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

            // 设置OutputCache
            OutputCacheAttribute outputCache = vkInfo.GetOutputCacheSetting();
            if (outputCache != null)
                outputCache.SetResponseCache(context);

            // 处理方法的返回结果
            IActionResult executeResult = result as IActionResult;
            if (executeResult != null)
            {
                executeResult.Ouput(context);
            }
            else
            {
                if (result != null)
                {
                    // 普通类型结果
                    context.Response.ContentType = "text/plain";
                    context.Response.Write(result.ToString());
                }
            }
        }
Esempio n. 8
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;
            }
        }
Esempio n. 9
0
        /// <summary>
        /// 根据一个页面请求路径,返回内部表示的调用信息。
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static InvokeInfo GetActionInvokeInfo(string url)
        {
            if (string.IsNullOrEmpty(url))
                throw new ArgumentNullException("url");

            ActionDescription action = null;
            if (s_PageActionDict.TryGetValue(url, out action) == false)
                return null;

            InvokeInfo vkInfo = new InvokeInfo();
            vkInfo.Controller = action.PageController;
            vkInfo.Action = action;

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

            return vkInfo;
        }
Esempio n. 10
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;
        }