/// <summary>
        /// This class is called by Web API system to select action method from given controller.
        /// </summary>
        /// <param name="controllerContext">Controller context</param>
        /// <returns>Action to be used</returns>
        public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            object controllerInfoObj;

            if (controllerContext.ControllerDescriptor.Properties.TryGetValue("__AbpDynamicApiControllerInfo", out controllerInfoObj))
            {
                //Get controller information which is selected by AbpHttpControllerSelector.
                var controllerInfo = controllerInfoObj as DynamicApiControllerInfo;
                if (controllerInfo == null)
                {
                    throw new AbpException("__AbpDynamicApiControllerInfo in ControllerDescriptor.Properties is not a " + typeof(DynamicApiControllerInfo).FullName + " class.");
                }

                //Get action name
                var serviceNameWithAction = (controllerContext.RouteData.Values["serviceNameWithAction"] as string);
                if (serviceNameWithAction != null)
                {
                    var actionName = DynamicApiServiceNameHelper.GetActionNameInServiceNameWithAction(serviceNameWithAction);

                    //Get action information
                    if (!controllerInfo.Actions.ContainsKey(actionName))
                    {
                        throw new AbpException("There is no action " + actionName + " defined for api controller " + controllerInfo.ServiceName);
                    }

                    return(new DyanamicHttpActionDescriptor(controllerContext.ControllerDescriptor, controllerInfo.Actions[actionName].Method, controllerInfo.Actions[actionName].Filters));
                }
            }

            return(base.SelectAction(controllerContext));
        }
        /// <summary>
        /// 此方法被系统调用,选择给定Controller的Action方法
        /// </summary>
        /// <param name="controllerContext">Controller上下文</param>
        /// <returns></returns>
        public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            object controllerInfoObj;

            if (!controllerContext.ControllerDescriptor.Properties.TryGetValue("__MSDynamicApiControllerInfo", out controllerInfoObj))
            {
                return(base.SelectAction(controllerContext));
            }
            var controllerInfo = controllerInfoObj as DynamicApiControllerInfo;

            if (null == controllerInfo)
            {
                throw new MSException("__MSDynamicApiControllerInfo in ControllerDescriptor.Properties is not a " + typeof(DynamicApiControllerInfo).FullName + " class.");
            }
            var hasActionName = (bool)controllerContext.ControllerDescriptor.Properties["__MSDynamicApiHasActionName"];

            if (!hasActionName)
            {
                return(GetActionDescriptorByCurrentHttpVerb(controllerContext, controllerInfo));
            }
            //从路由中获取action名称
            var serviceNameWithAction = controllerContext.RouteData.Values["serviceNameWithAction"] as string;

            if (null == serviceNameWithAction)
            {
                return(base.SelectAction(controllerContext));
            }
            var actionName = DynamicApiServiceNameHelper.GetActionNameInServiceNameWithAction(serviceNameWithAction);

            return(GetActionDescriptorByActionName(controllerContext, controllerInfo, actionName));
        }
        /// <summary>
        /// This class is called by Web API system to select action method from given controller.
        /// </summary>
        /// <param name="controllerContext">Controller context</param>
        /// <returns>Action to be used</returns>
        public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            object controllerInfoObj;

            if (!controllerContext.ControllerDescriptor.Properties.TryGetValue("__AbpDynamicApiControllerInfo", out controllerInfoObj))
            {
                return(GetDefaultActionDescriptor(controllerContext));
            }

            //Get controller information which is selected by AbpHttpControllerSelector.
            var controllerInfo = controllerInfoObj as DynamicApiControllerInfo;

            if (controllerInfo == null)
            {
                throw new AbpException("__AbpDynamicApiControllerInfo in ControllerDescriptor.Properties is not a " + typeof(DynamicApiControllerInfo).FullName + " class.");
            }

            //No action name case
            var hasActionName = (bool)controllerContext.ControllerDescriptor.Properties["__AbpDynamicApiHasActionName"];

            if (!hasActionName)
            {
                return(GetActionDescriptorByCurrentHttpVerb(controllerContext, controllerInfo));
            }

            //Get action name from route
            var serviceNameWithAction = (controllerContext.RouteData.Values["serviceNameWithAction"] as string);

            if (serviceNameWithAction == null)
            {
                return(GetDefaultActionDescriptor(controllerContext));
            }

            var actionName = DynamicApiServiceNameHelper.GetActionNameInServiceNameWithAction(serviceNameWithAction);

            return(GetActionDescriptorByActionName(
                       controllerContext,
                       controllerInfo,
                       actionName
                       ));
        }