/// <summary> /// 初始化(异步) /// </summary> /// <param name="ashxRoute">路由信息对象</param> /// <param name="httpHandler">构造的对应实现</param> /// <param name="objs">数据</param> internal static async Task StartMinAsyncAshx(IMinHttpAsynApi httpHandler, AshxRouteData ashxRoute, object[] objs) { await httpHandler.TaskRequest(ashxRoute, objs) .ContinueWith((task) => { httpHandler.ContinueWith(task, ashxRoute); }); // Task.Run(() => //{ // //httpHandler.SetRouteData(RouteData); // //RouteData.HttpContext.Response.AppendHeader(AshxVersionHeaderAsyncName, AshxVersion); // using (httpHandler) // { // ; // // if (taskWrapperAsync.Task.IsFaulted) // // { // // AshxException(new AshxException(RouteData.GetAshx, new Exception("发生异常,异步处理过程中发生异常。", taskWrapperAsync.Task.Exception.GetBaseException())) { ExceptionHandled = true }); // // } // // if (!taskWrapperAsync.Task.IsCompleted) // // { // // AshxException(new AshxException(RouteData.GetAshx, new Exception("发生异常,异步处理未完成。")) { ExceptionHandled = true }); // // } // } //}); }
/// <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()); }