/// <summary>注册服务</summary> /// <param name="controller">控制器对象</param> /// <param name="method">动作名称。为空时遍历控制器所有公有成员方法</param> public void Register(Object controller, String method) { if (controller == null) { throw new ArgumentNullException(nameof(controller)); } var type = controller is Type ? controller as Type : controller.GetType(); if (!method.IsNullOrEmpty()) { var mi = type.GetMethodEx(method); var act = new ApiAction(mi, type) { Controller = controller }; Services[act.Name] = act; } else { RegisterAll(controller, type); } }
/// <summary>创建控制器实例</summary> /// <param name="api"></param> /// <returns></returns> public virtual Object CreateController(ApiAction api) { return(_Host.CreateController(this, api)); }
/// <summary>创建控制器实例</summary> /// <param name="host"></param> /// <param name="session"></param> /// <param name="api"></param> /// <returns></returns> public static Object CreateController(this IApiHost host, IApiSession session, ApiAction api) { var controller = api.Controller; if (controller != null) { return(controller); } controller = api.Type.CreateInstance(); return(controller); }
/// <summary>创建控制器实例</summary> /// <param name="api"></param> /// <returns></returns> public virtual Object CreateController(ApiAction api) => _Host.CreateController(this, api);
/// <summary>注册服务</summary> /// <param name="method">动作名称。为空时遍历控制器所有公有成员方法</param> public void Register(MethodInfo method) { var act = new ApiAction(method, null); Services[act.Name] = act; }
/// <summary>准备上下文,可以借助Token重写Session会话集合</summary> /// <param name="session"></param> /// <param name="action"></param> /// <param name="args"></param> /// <param name="api"></param> /// <param name="msg"></param> /// <returns></returns> protected override ControllerContext Prepare(IApiSession session, String action, Packet args, ApiAction api, IMessage msg) { var ctx = base.Prepare(session, action, args, api, msg); var token = session.Token; if (!token.IsNullOrEmpty()) { // 第一用户数据是本地字典,用于记录是否启用了第二数据 if (session is ApiNetSession ns && ns.Items["Token"] + "" != token) { var key = GetKey(token); // 采用哈希结构。内存缓存用并行字段,Redis用Set ns.Items2 = Cache.GetDictionary <Object>(key); ns.Items["Token"] = token; } } return(ctx); }
/// <summary>准备上下文,可以借助Token重写Session会话集合</summary> /// <param name="session"></param> /// <param name="action"></param> /// <param name="args"></param> /// <param name="api"></param> /// <param name="msg">消息内容,辅助数据解析</param> /// <returns></returns> protected virtual ControllerContext Prepare(IApiSession session, String action, Packet args, ApiAction api, IMessage msg) { //var enc = Host.Encoder; var enc = session["Encoder"] as IEncoder ?? Host.Encoder; // 当前上下文 var ctx = ControllerContext.Current; if (ctx == null) { ctx = new ControllerContext(); ControllerContext.Current = ctx; } ctx.Action = api; ctx.ActionName = action; ctx.Session = session; ctx.Request = args; // 如果服务只有一个二进制参数,则走快速通道 if (!api.IsPacketParameter) { // 不允许参数字典为空 var dic = args == null || args.Total == 0 ? new NullableDictionary <String, Object>(StringComparer.OrdinalIgnoreCase) : enc.DecodeParameters(action, args, msg); ctx.Parameters = dic; session.Parameters = dic; // 令牌,作为参数或者http头传递 if (dic.TryGetValue("Token", out var token)) { session.Token = token + ""; } if (session.Token.IsNullOrEmpty() && msg is HttpMessage hmsg && hmsg.Headers != null) { // post、package、byte三种情况将token 写入请求头 if (hmsg.Headers.TryGetValue("x-token", out var token2)) { session.Token = token2; } else if (hmsg.Headers.TryGetValue("Authorization", out token2)) { session.Token = token2.TrimStart("Bearer "); } } // 准备好参数 var ps = GetParams(api.Method, dic, enc); ctx.ActionParameters = ps; } return(ctx); }
/// <summary>创建控制器实例</summary> /// <param name="host"></param> /// <param name="session"></param> /// <param name="api"></param> /// <returns></returns> public static Object CreateController(this IApiHost host, IApiSession session, ApiAction api) { var controller = api.Controller; if (controller != null) { return(controller); } var att = api.Type?.GetCustomAttribute <ApiAttribute>(true); if (att != null && att.IsReusable) { var ts = session["Controller"] as IDictionary <Type, Object>; if (ts == null) { session["Controller"] = ts = new NullableDictionary <Type, Object>(); // 析构时销毁所有从属控制器 var sd = session as IDisposable2; if (sd != null) { sd.OnDisposed += (s, e) => { foreach (var item in ts) { item.Value.TryDispose(); } } } ; } controller = ts[api.Type]; if (controller == null) { controller = ts[api.Type] = api.Type.CreateInstance(); } return(controller); } controller = api.Type.CreateInstance(); return(controller); } }
/// <summary>准备上下文</summary> /// <param name="session"></param> /// <param name="action"></param> /// <param name="args"></param> /// <param name="api"></param> /// <returns></returns> protected virtual ControllerContext Prepare(IApiSession session, String action, Packet args, ApiAction api) { //var enc = Host.Encoder; var enc = session["Encoder"] as IEncoder ?? Host.Encoder; // 当前上下文 var ctx = ControllerContext.Current; if (ctx == null) { ctx = new ControllerContext(); ControllerContext.Current = ctx; } ctx.Action = api; ctx.ActionName = action; ctx.Session = session; ctx.Request = args; // 如果服务只有一个二进制参数,则走快速通道 if (!api.IsPacketParameter) { // 不允许参数字典为空 var dic = args == null || args.Total == 0 ? new NullableDictionary <String, Object>(StringComparer.OrdinalIgnoreCase) : enc.DecodeParameters(action, args); ctx.Parameters = dic; // 准备好参数 var ps = GetParams(api.Method, dic, enc); ctx.ActionParameters = ps; } return(ctx); }