Beispiel #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));
        }
Beispiel #3
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
                }
            };
        }
    }
Beispiel #4
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);



            // 处理方法的返回结果
            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());
                }
            }
        }
Beispiel #5
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);
            }
        }