/// <summary>执行</summary> /// <param name="session"></param> /// <param name="action"></param> /// <param name="args"></param> /// <returns></returns> public async Task <Object> Execute(IApiSession session, String action, IDictionary <String, Object> args) { var api = Host.Manager.Find(action); if (api == null) { throw new ApiException(404, "无法找到名为[{0}]的服务!".F(action)); } // 复用控制器对象 var controller = Host.IsReusable ? session["Controller"] : null; if (controller == null) { // 全局共用控制器,或者每次创建对象实例 controller = api.Controller ?? api.Method.DeclaringType.CreateInstance(); if (controller is IApi) { (controller as IApi).Session = session; } } // 服务设置优先于全局主机 var svr = session.GetService <IApiServer>(); var enc = svr?.Encoder ?? Host.Encoder; // 复用控制器对象 if (Host.IsReusable) { session["Controller"] = controller; } // 全局过滤器、控制器特性、Action特性 var fs = api.ActionFilters; // 控制器实现了过滤器接口 if (controller is IActionFilter) { var list = fs.ToList(); list.Add(controller as IActionFilter); fs = list.ToArray(); } // 准备好参数 var ps = GetParams(api.Method, args, enc); // 上下文 var ctx = new ControllerContext { Controller = controller, Action = api, Session = session, Parameters = args }; Object rs = null; ExceptionContext etx = null; try { // 执行动作前的过滤器 var actx = OnExecuting(ctx, fs, ps); rs = actx.Result; // 执行动作 if (rs == null) { rs = await Task.Run(() => { // 当前上下文 ControllerContext.Current = actx; try { var result = controller.InvokeWithParams(api.Method, ps as IDictionary); return(result); } finally { ControllerContext.Current = null; } }); } } catch (ThreadAbortException) { throw; } catch (Exception ex) { var efs = api.ExceptionFilters; // 控制器实现了异常过滤器接口 if (controller is IExceptionFilter) { var list = efs.ToList(); list.Add(controller as IExceptionFilter); efs = list.ToArray(); } // 执行异常过滤器 etx = OnException(ctx, ex, efs, rs); // 如果异常没有被拦截,继续向外抛出 if (!etx.ExceptionHandled) { throw; } return(rs = etx.Result); } finally { // 执行动作后的过滤器 rs = OnExecuted(ctx, etx, fs, rs); } return(rs); }
/// <summary>执行</summary> /// <param name="session"></param> /// <param name="action"></param> /// <param name="args"></param> /// <returns></returns> public Object Execute(IApiSession session, String action, IDictionary <String, Object> args) { var api = session.FindAction(action); if (api == null) { throw new ApiException(404, "无法找到名为[{0}]的服务!".F(action)); } // 全局共用控制器,或者每次创建对象实例 var controller = session.CreateController(api); if (controller == null) { throw new ApiException(403, "无法创建名为[{0}]的服务!".F(api.Name)); } if (controller is IApi) { (controller as IApi).Session = session; } // 服务端需要检查登录授权 var svrHost = Host as ApiServer; if (svrHost != null && !svrHost.Anonymous) { if (controller.GetType().GetCustomAttribute <AllowAnonymousAttribute>() == null && api.Method.GetCustomAttribute <AllowAnonymousAttribute>() == null) { if (session.UserSession == null || !session.UserSession.Logined) { throw new ApiException(401, "未登录!"); } } } // 服务设置优先于全局主机 var svr = session.GetService <IApiServer>(); var enc = svr?.Encoder ?? Host.Encoder; // 全局过滤器、控制器特性、Action特性 var fs = api.ActionFilters; // 控制器实现了过滤器接口 if (controller is IActionFilter) { var list = fs.ToList(); list.Add(controller as IActionFilter); fs = list.ToArray(); } // 不允许参数字典为空 if (args == null) { args = new NullableDictionary <String, Object>(StringComparer.OrdinalIgnoreCase); } else { args = args.ToNullable(StringComparer.OrdinalIgnoreCase); } // 准备好参数 var ps = GetParams(api.Method, args, enc); // 上下文 var ctx = new ControllerContext { Controller = controller, Action = api, Session = session, Parameters = args }; Object rs = null; ExceptionContext etx = null; try { // 当前上下文 var actx = new ActionExecutingContext(ctx) { ActionParameters = ps }; ControllerContext.Current = actx; // 执行动作前的过滤器 OnExecuting(actx, fs); rs = actx.Result; // 执行动作 if (rs == null) { rs = controller.InvokeWithParams(api.Method, ps as IDictionary); } } catch (ThreadAbortException) { throw; } catch (Exception ex) { // 过滤得到内层异常 ex = ex.GetTrue(); var efs = api.ExceptionFilters; // 控制器实现了异常过滤器接口 if (controller is IExceptionFilter) { var list = efs.ToList(); list.Add(controller as IExceptionFilter); efs = list.ToArray(); } // 执行异常过滤器 etx = OnException(ctx, ex, efs, rs); Host.WriteLog("执行{0}出错!{1}", action, ex.Message); // 如果异常没有被拦截,继续向外抛出 if (!etx.ExceptionHandled) { throw; } return(rs = etx.Result); } finally { // 执行动作后的过滤器 rs = OnExecuted(ctx, etx, fs, rs); ControllerContext.Current = null; } return(rs); }