Example #1
0
        /// <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);
            }
        }
Example #2
0
 /// <summary>创建控制器实例</summary>
 /// <param name="api"></param>
 /// <returns></returns>
 public virtual Object CreateController(ApiAction api)
 {
     return(_Host.CreateController(this, api));
 }
Example #3
0
        /// <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);
        }
Example #4
0
 /// <summary>创建控制器实例</summary>
 /// <param name="api"></param>
 /// <returns></returns>
 public virtual Object CreateController(ApiAction api) => _Host.CreateController(this, api);
Example #5
0
        /// <summary>注册服务</summary>
        /// <param name="method">动作名称。为空时遍历控制器所有公有成员方法</param>
        public void Register(MethodInfo method)
        {
            var act = new ApiAction(method, null);

            Services[act.Name] = act;
        }
Example #6
0
        /// <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);
        }
Example #7
0
        /// <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);
        }
Example #8
0
        /// <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);
        }
    }
Example #9
0
        /// <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);
        }