示例#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);
        }
        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));
        }