Пример #1
0
        /// <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 });
            //            //    }
            //        }
            //});
        }
Пример #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());
                }