示例#1
0
        private async Task <object> ActionInvoker()
        {
            var action = ApiActionFactory.Get(this, ActionName, ActionVersion);

            if (action == null)
            {
                return(ErrorResult(new ApiException(ExceptionCode.ApiNotFound)));
            }
            if (action.Obsolete != null && action.Obsolete.IsError)
            {
                return(ErrorResult(new ApiException(ExceptionCode.ApiObsolete, action.Obsolete.Message)));
            }
            ActionName = action.Name;
            ApiAction  = action;
            //验证签名
            if (action.HasFilter <SignAttribute>())
            {
                var signer = new Signer();
                if (_NoSign == false)
                {
                    var ex = signer.CheckAsync(this); //验证签名返回错误消息
                    if (ex != null)                   //如果必须签名,则抛出异常
                    {
                        return(ErrorResult(ex));
                    }
                }
            }


            //是否启动Session
            var sessionState = SessionState;

            if (sessionState == ApiSessionState.Auto)
            {
                sessionState = IsBrowser ? ApiSessionState.Enable : ApiSessionState.Disable;
            }
            switch (sessionState)
            {
            case ApiSessionState.Enable:
                Properties["SessionState"] = 1;
                var err = await OnInitSession();

                if (err != null)
                {
                    return(ErrorResult(err));
                }
                break;

            case ApiSessionState.Disable:
            case ApiSessionState.Auto:
            default:
                Properties["SessionState"] = 0;
                Trace.WriteLine("本次请求禁用Session");
                Session = new DictionarySession();
                break;
            }
            //用户
            if (!action.HasFilter <NoLoginAttribute>())
            {
                //初始化用户
                var task = OnInitUser();
                var ex   = task.IsNull() ? null : await task;
                if (ex != null)
                {
                    return(ErrorResult(ex));
                }
            }
            //解析Url参数
            Exception parseError;
            var       args = action.GetArguments(RequestValues, out parseError);

            if (parseError != null)
            {
                return(ErrorResult(parseError));
            }
            //验证参数

            //执行前
            {
                var task = OnExecuting(action.Name);
                var r    = await task;
                if (r != null)
                {
                    Trace.WriteLine("Api.OnExecuting截断");
                    return(ProcessResult(r));
                }
            }
            //前Filter
            {
                var r = await action.OnActionExecuting(this);

                if (r != null)
                {
                    Trace.WriteLine("Filter.OnExecuting截断");
                    return(ProcessResult(r));
                }
            }
            //执行Action
            var result = await ApiAction.TryRunTask(action.Execute(this, args));

            {//后Filter
                var r = await action.OnActionExecuted(this, result);

                if (r != null)
                {
                    Trace.WriteLine("Filter.OnExecuted截断");
                    return(ProcessResult(r));
                }
            }

            {//执行后
                var task = OnExecuted(action.Name, result);
                var r    = await task;
                if (r == null)
                {
                    return(ProcessResult(result));
                }
                Trace.WriteLine("Api.OnExecuted截断");
                return(ProcessResult(r));
            }
        }