Exemple #1
0
        /// <summary>
        /// 第一次绑定方法控制数据
        /// </summary>
        internal void GetKeyAttributes(bool isMin)
        {
            this.IsMinApi = isMin;

            if (this.IsMinApi)
            {
                this.IsTask = AshxExtension.IsTaskApiOut(Method.ReturnType);// Method.ReturnType == typeof(Task<IApiOut>)
            }
            else
            {
                this.IsTask = Method.ReturnType == typeof(Task) || Method.ReturnType == typeof(OnAshxEvent);//(Method.ReturnType == typeof(Task) || Method.ReturnType == typeof(OnAshxEvent) ? true : false);
            }



            this.IsOnAshxEvent = Method.ReturnType == typeof(OnAshxEvent); //(Method.ReturnType == typeof(OnAshxEvent) ? true : false);

            //lock (this)
            //{
            //_keyAttributes = new Dictionary<Type, Attribute>();
            try
            {
                Dictionary <Type, Attribute> _attrikeys = new();
                var Attributes = GetAttributes();
                foreach (Attribute attribute in Attributes)
                {
                    if (!(attribute is Ashx))
                    {
                        _attrikeys.Add(attribute.GetType(), attribute);
                    }
                }

                _keyAttributes = _attrikeys.AsReadOnly();
            }
            catch
            {
            }
            //}
        }
Exemple #2
0
        /// <summary>
        /// (默认是内部调用)调用此方法,可以对 当前路由的信息 Application_Start() 方法中调用 AshxRegistration.RegisterAllAreas();
        /// </summary>
        internal Task IHttpHandlerAshxExecute(AshxRouteData _routeData)
        {
            string key = _routeData.Controller; ////string text = requestContext.RouteData.GetRequiredString("controller");$"{Registration.Segment}{text}";

            if (AshxBuilder.RouteDefaults.TryGetValue(key, out AshxExtension extension))
            {
                if (_routeData.Area != string.Empty && !_routeData.Area.Equals(extension.AshxType.Namespace))
                {
                    throw _routeData.HttpContext.AddHttpException(404, string.Format(System.Globalization.CultureInfo.CurrentCulture, "找不到该路由的控制器:“{0}” ,URL: {1}", new object[] { key, _routeData.HttpContext.Request.Path }));
                }

                Ashx ashx;
                void isMethod()
                {
                    if (extension.IsMethod(_routeData.Action, out ashx))
                    {
                        _routeData.GetAshx = ashx;
                        //SessionStateBehavior sessionState = (SessionStateBehavior)(int)ashx.IsSession;//Enum.Parse(typeof(SessionStateBehavior),);
                        //requestContext.HttpContext.SetSessionStateBehavior(sessionState);
                    }
                    else
                    {
                        _routeData.IsAshx = false;
                        //requestContext.HttpContext.SetSessionStateBehavior(SessionStateBehavior.Disabled);

                        //在控制器“TaskApi”上未找到可执行方法“SellerInf
                        throw _routeData.HttpContext.AddHttpException(404, string.Format(System.Globalization.CultureInfo.CurrentCulture, "在控制器“{0}”上未找到可执行方法“{1}”,URL: {2}", new object[] { key, _routeData.Action, _routeData.HttpContext.Request.Path }));
                    }
                }

                isMethod();

                _routeData.SetKey();

                bool isOptions()
                {
                    if (AshxExtension.CrossDomain(_routeData.HttpContext.Response, _routeData.GetAshx) && _routeData.HttpContext.Request.Method.EqualsNotCase("OPTIONS"))
                    {
                        _routeData.Handler = async(_) => await Task.CompletedTask;
                        Info(_routeData);
                        return(true);
                    }
                    return(false);
                }

                if (isOptions())
                {
                    return(Task.CompletedTask);
                }

                if (!AshxExtension.HttpMethod(_routeData.HttpContext.Request.Method, ashx.State))
                {
                    _routeData.Handler = async(HttpContext i) => await AshxHandlerOrAsync.CustomOutput(i, "application/json", "请求类型错误!", 403);

                    return(Task.CompletedTask);
                }

                if (extension.IsMin)
                {
                    Task minapi()
                    {
                        IMinHttpAsynApi handler = extension.MinHttpAsynApi;

                        if (AshxHandlerOrAsync.MinInitialize(handler, _routeData))
                        {
                            if (AshxHandlerOrAsync.GetMinObj(_routeData, out object[] _objs))
                            {
                                _routeData.Handler = async(HttpContext i) => await AshxHandlerOrAsync.CustomOutput(i, "application/json", "框架错误,请查看日志文件!", 500);

                                return(Task.CompletedTask);
                            }

                            Info(_routeData);

                            if (ashx.IsTask)
                            {
                                //AshxAsyncHandler ashxAsync = new AshxAsyncHandler(handler as IHttpAsynApi, _routeData);
                                _routeData.Handler = async(HttpContext i) => await AshxHandlerOrAsync.StartMinAsyncAshx(handler, _routeData, _objs);

                                //return Task.CompletedTask;
                            }
                            else
                            {
                                //AshxHandler ashxHandler = new AshxHandler(handler as IHttpApi, _routeData);
                                _routeData.Handler = async(HttpContext i) => await AshxHandlerOrAsync.StartMinAshx(handler, _routeData, _objs);
                            }

                            return(Task.CompletedTask);
                        }
                        else
                        {
                            //因用户取消逻辑
                            _routeData.Handler = async(HttpContext i) => await Task.CompletedTask;
                            return(Task.CompletedTask);
                        }
                    }

                    return(minapi());
                }