/// <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 { } //} }
/// <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()); }