Exemple #1
0
        /// <summary>调用</summary>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="action">服务操作</param>
        /// <param name="args">参数</param>
        /// <param name="flag">标识</param>
        /// <returns></returns>
        public static Boolean Invoke(IApiHost host, IApiSession session, String action, Object args, Byte flag = 0)
        {
            if (session == null)
            {
                return(false);
            }

            host.StatSend?.Increment();

            // 编码请求
            var pk = EncodeArgs(host.Encoder, action, args);

            // 构造消息
            var msg = new DefaultMessage
            {
                OneWay  = true,
                Payload = pk,
            };

            if (flag > 0)
            {
                msg.Flag = flag;
            }

            return(session.Send(msg));
        }
Exemple #2
0
        /// <summary>执行过滤器</summary>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="msg"></param>
        /// <param name="issend"></param>
        internal static void ExecuteFilter(this IApiHost host, IApiSession session, IMessage msg, Boolean issend)
        {
            var fs = host.Filters;

            if (fs.Count == 0)
            {
                return;
            }

            // 接收时需要倒序
            if (!issend)
            {
                fs = fs.Reverse().ToList();
            }

            var ctx = new ApiFilterContext {
                Session = session, Packet = msg.Payload, Message = msg, IsSend = issend
            };

            foreach (var item in fs)
            {
                item.Execute(ctx);
            }
            msg.Payload = ctx.Packet;
        }
Exemple #3
0
        /// <summary>开始会话处理</summary>
        public override void Start()
        {
            base.Start();

            //_Host = this.GetService<IApiHost>();
            _Host = Host.Provider as ApiServer;
        }
Exemple #4
0
        public ApiHostCatalog HostCatalog(IApiHost src)
        {
            var flow    = Wf.Running(Msg.CreatingHostCatalog.Format(src.HostUri));
            var members = ApiJit.JitHost(src);
            var result  = members.Length == 0 ? ApiHostCatalog.Empty : new ApiHostCatalog(src, members);

            Wf.Ran(flow, Msg.CreatedHostCatalog.Format(src.HostUri, members.Count));
            return(result);
        }
Exemple #5
0
        /// <summary>开始会话处理</summary>
        public override void Start()
        {
            base.Start();

            _Host = Host.Host;

            if (_Host is ApiHost host)
            {
                host.OnNewSession(this, null);
            }
        }
Exemple #6
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);
        }
Exemple #7
0
        /// <summary>调用</summary>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="action">服务操作</param>
        /// <param name="args">参数</param>
        /// <param name="flag">标识</param>
        /// <returns></returns>
        public static Boolean Invoke(IApiHost host, Object session, String action, Object args, Byte flag = 0)
        {
            if (session == null)
            {
                return(false);
            }

            // 性能计数器,次数、TPS、平均耗时
            var st = host.StatInvoke;

            // 编码请求
            var msg = host.Encoder.CreateRequest(action, args);

            if (msg is DefaultMessage dm)
            {
                dm.OneWay = true;
                if (flag > 0)
                {
                    dm.Flag = flag;
                }
            }

            var sw = st.StartCount();

            try
            {
                if (session is IApiSession ss)
                {
                    return(ss.Send(msg));
                }
                else if (session is ISocketRemote client)
                {
                    return(client.SendMessage(msg));
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }
            finally
            {
                var msCost = st.StopCount(sw) / 1000;
                if (host.SlowTrace > 0 && msCost >= host.SlowTrace)
                {
                    host.WriteLog($"慢调用[{action}],耗时{msCost:n0}ms");
                }
            }
        }
Exemple #8
0
        /// <summary>调用</summary>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="action">服务操作</param>
        /// <param name="args">参数</param>
        /// <param name="flag">标识</param>
        /// <returns></returns>
        public static Boolean Invoke(IApiHost host, Object session, String action, Object args, Byte flag = 0)
        {
            if (session == null)
            {
                return(false);
            }

            // 性能计数器,次数、TPS、平均耗时
            //host.StatSend?.Increment();
            var st = host.StatInvoke;

            // 编码请求
            var pk = EncodeArgs(host.Encoder, action, args);

            // 构造消息
            var msg = new DefaultMessage
            {
                OneWay  = true,
                Payload = pk,
            };

            if (flag > 0)
            {
                msg.Flag = flag;
            }

            var sw = st.StartCount();

            try
            {
                if (session is IApiSession ss)
                {
                    return(ss.Send(msg));
                }
                else if (session is ISocketRemote client)
                {
                    return(client.SendMessage(msg));
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }
            finally
            {
                st.StopCount(sw);
            }
        }
        /// <summary>初始化</summary>
        /// <param name="config"></param>
        /// <param name="host"></param>
        /// <returns></returns>
        public virtual Boolean Init(Object config, IApiHost host)
        {
            Host = host;

            Local = config as NetUri;
            // 如果主机为空,监听所有端口
            if (Local.Host.IsNullOrEmpty() || Local.Host == "*")
            {
                AddressFamily = System.Net.Sockets.AddressFamily.Unspecified;
            }

            // 新生命标准网络封包协议
            Add(Host.GetMessageCodec());

            return(true);
        }
Exemple #10
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);
        }
    }
Exemple #11
0
        /// <summary>调用</summary>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="action">服务操作</param>
        /// <param name="args">参数</param>
        /// <param name="flag">标识</param>
        /// <returns></returns>
        public static Boolean Invoke(IApiHost host, Object session, String action, Object args, Byte flag = 0)
        {
            if (session == null)
            {
                return(false);
            }

            // 性能计数器,次数、TPS、平均耗时
            //host.StatSend?.Increment();
            var st = host.StatInvoke;

            // 编码请求
            var msg = host.Encoder.CreateRequest(action, args);

            if (msg is DefaultMessage dm)
            {
                dm.OneWay = true;
                if (flag > 0)
                {
                    dm.Flag = flag;
                }
            }

            var sw = st.StartCount();

            try
            {
                if (session is IApiSession ss)
                {
                    return(ss.Send(msg));
                }
                else if (session is ISocketRemote client)
                {
                    return(client.SendMessage(msg));
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }
            finally
            {
                st.StopCount(sw);
            }
        }
Exemple #12
0
        /// <summary>初始化</summary>
        /// <param name="config"></param>
        /// <param name="host"></param>
        /// <returns></returns>
        public override Boolean Init(Object config, IApiHost host)
        {
            Host = host;

            var uri = config as NetUri;

            Port = uri.Port;

            RawUrl = uri + "";

            // Http封包协议
            Add <HttpCodec>();

            //host.Handler = new ApiHttpHandler { Host = host };
            host.Encoder = new HttpEncoder();

            return(true);
        }
Exemple #13
0
        /// <summary>获取统计信息</summary>
        /// <param name="host"></param>
        /// <returns></returns>
        public static String GetStat(this IApiHost host)
        {
            if (host == null)
            {
                return(null);
            }

            var sb = new StringBuilder();

            if (host.StatSend.Value > 0)
            {
                sb.AppendFormat("请求:{0} ", host.StatSend);
            }
            if (host.StatReceive.Value > 0)
            {
                sb.AppendFormat("处理:{0} ", host.StatReceive);
            }

            return(sb.ToString());
        }
Exemple #14
0
        /// <summary>获取统计信息</summary>
        /// <param name="host"></param>
        /// <returns></returns>
        public static String GetStat(this IApiHost host)
        {
            if (host == null)
            {
                return(null);
            }

            var sb = new StringBuilder();

            if (host.StatSend.Value > 0)
            {
                sb.AppendFormat("请求:{0} ", host.StatSend);
            }
            if (host.StatReceive.Value > 0)
            {
                sb.AppendFormat("处理:{0} ", host.StatReceive);
            }

            if (host is ApiServer svr && svr.Server is NetServer ns)
            {
                sb.Append(ns.GetStat());
            }
Exemple #15
0
        /// <summary>获取统计信息</summary>
        /// <param name="host"></param>
        /// <returns></returns>
        public static String GetStat(this IApiHost host)
        {
            if (host == null)
            {
                return(null);
            }

            var sb  = Pool.StringBuilder.Get();
            var pf1 = host.StatInvoke;
            var pf2 = host.StatProcess;

            if (pf1 != null && pf1.Value > 0)
            {
                sb.AppendFormat("请求:{0} ", pf1);
            }
            if (pf2 != null && pf2.Value > 0)
            {
                sb.AppendFormat("处理:{0} ", pf2);
            }

            if (host is ApiServer svr && svr.Server is NetServer ns)
            {
                sb.Append(ns.GetStat());
            }
Exemple #16
0
 internal ApiHostCatalog(IApiHost host, ApiMembers src)
 {
     Host    = host;
     Members = src;
 }
Exemple #17
0
        /// <summary>调用</summary>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="resultType">结果类型</param>
        /// <param name="action">服务操作</param>
        /// <param name="args">参数</param>
        /// <param name="flag">标识</param>
        /// <returns></returns>
        public static async Task <Object> InvokeAsync(IApiHost host, Object session, Type resultType, String action, Object args, Byte flag)
        {
            if (session == null)
            {
                return(null);
            }

            // 性能计数器,次数、TPS、平均耗时
            //host.StatSend?.Increment();
            var st = host.StatInvoke;
            var sw = st.StartCount();

            // 编码请求
            var enc = host.Encoder;
            var pk  = EncodeArgs(enc, action, args);

            // 构造消息
            var msg = new DefaultMessage {
                Payload = pk,
            };

            if (flag > 0)
            {
                msg.Flag = flag;
            }

            IMessage rs = null;

            try
            {
                if (session is IApiSession ss)
                {
                    rs = await ss.SendAsync(msg);
                }
                else if (session is ISocketRemote client)
                {
                    rs = (await client.SendMessageAsync(msg)) as IMessage;
                }
                else
                {
                    throw new InvalidOperationException();
                }
                //rs = await session.SendAsync(msg);
                if (rs == null)
                {
                    return(null);
                }
            }
            catch (AggregateException aggex)
            {
                var ex = aggex.GetTrue();
                if (ex is TaskCanceledException)
                {
                    throw new TimeoutException($"请求[{action}]超时!", ex);
                }
                throw aggex;
            }
            catch (TaskCanceledException ex)
            {
                throw new TimeoutException($"请求[{action}]超时!", ex);
            }
            finally
            {
                st.StopCount(sw);
            }

            // 特殊返回类型
            if (resultType == typeof(IMessage))
            {
                return(rs);
            }
            //if (resultType == typeof(Packet)) return rs.Payload;

            if (!Decode(rs, out var act, out var code, out var data))
            {
                throw new InvalidOperationException();
            }

            // 是否成功
            if (code != 0)
            {
                throw new ApiException(code, data.ToStr());
            }

            if (data == null)
            {
                return(null);
            }
            if (resultType == typeof(Packet))
            {
                return(data);
            }

            // 解码结果
            var result = enc.Decode(action, data);

            if (resultType == typeof(Object))
            {
                return(result);
            }

            // 返回
            return(enc.Convert(result, resultType));
        }
Exemple #18
0
        /// <summary>开始会话处理</summary>
        public override void Start()
        {
            base.Start();

            _ApiHost = this.GetService <IApiHost>();
        }
Exemple #19
0
        /// <summary>开始会话处理</summary>
        public override void Start()
        {
            base.Start();

            _Host = Host.Host;
        }
Exemple #20
0
        /// <summary>调用</summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="action"></param>
        /// <param name="args"></param>
        /// <param name="cookie">附加参数,位于顶级</param>
        /// <returns></returns>
        public static async Task <TResult> InvokeAsync <TResult>(IApiHost host, IApiSession session, String action, Object args, IDictionary <String, Object> cookie)
        {
            if (session == null)
            {
                return(default(TResult));
            }

            var enc = host.Encoder;
            //var data = enc.Encode(action, args, cookie);
            var data = enc.Encode(new { action, args }.ToDictionary().Merge(cookie));

            var msg = session.CreateMessage(data);

            // 过滤器
            host.ExecuteFilter(session, msg, true);

            var rs = await session.SendAsync(msg).ConfigureAwait(false);

            if (rs == null)
            {
                return(default(TResult));
            }

            // 过滤器
            host.ExecuteFilter(session, rs, false);

            // 特殊返回类型
            if (typeof(TResult) == typeof(Packet))
            {
                return((TResult)(Object)rs.Payload);
            }

            var dic = enc.Decode(rs.Payload);

            if (typeof(TResult) == typeof(IDictionary <String, Object>))
            {
                return((TResult)(Object)dic);
            }

            //return enc.Decode<TResult>(dic);
            var    code   = 0;
            Object result = null;
            //enc.TryGet(dic, out code, out result);
            Object cod = null;

            dic.TryGetValue("code", out cod);

            // 参数可能不存在
            dic.TryGetValue("result", out result);
            code = cod.ToInt();

            // 是否成功
            if (code != 0)
            {
                throw new ApiException(code, result + "");
            }

            if (result == null)
            {
                return(default(TResult));
            }
            if (typeof(TResult) == typeof(Object))
            {
                return((TResult)result);
            }

            // 返回
            return(enc.Convert <TResult>(result));
        }
Exemple #21
0
        /// <summary>调用</summary>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="resultType">结果类型</param>
        /// <param name="action">服务操作</param>
        /// <param name="args">参数</param>
        /// <param name="flag">标识</param>
        /// <returns></returns>
        public static async Task <Object> InvokeAsync(IApiHost host, IApiSession session, Type resultType, String action, Object args, Byte flag)
        {
            if (session == null)
            {
                return(null);
            }

            host.StatSend?.Increment();

            // 编码请求
            var enc = host.Encoder;
            var pk  = EncodeArgs(enc, action, args);

            // 构造消息
            var msg = new DefaultMessage {
                Payload = pk,
            };

            if (flag > 0)
            {
                msg.Flag = flag;
            }

            var rs = await session.SendAsync(msg);

            if (rs == null)
            {
                return(null);
            }

            // 特殊返回类型
            if (resultType == typeof(IMessage))
            {
                return(rs);
            }
            //if (resultType == typeof(Packet)) return rs.Payload;

            if (!Decode(rs, out var act, out var code, out var data))
            {
                throw new InvalidOperationException();
            }

            // 是否成功
            if (code != 0)
            {
                throw new ApiException(code, data.ToStr());
            }

            if (data == null)
            {
                return(null);
            }
            if (resultType == typeof(Packet))
            {
                return(data);
            }

            // 解码结果
            var result = enc.Decode(action, data);

            if (resultType == typeof(Object))
            {
                return(result);
            }

            // 返回
            return(enc.Convert(result, resultType));
        }
Exemple #22
0
        /// <summary>调用</summary>
        /// <param name="host"></param>
        /// <param name="session"></param>
        /// <param name="resultType">结果类型</param>
        /// <param name="action">服务操作</param>
        /// <param name="args">参数</param>
        /// <param name="flag">标识</param>
        /// <returns></returns>
        public static async Task <Object> InvokeAsync(IApiHost host, Object session, Type resultType, String action, Object args, Byte flag)
        {
            if (session == null)
            {
                return(null);
            }

            // 性能计数器,次数、TPS、平均耗时
            //host.StatSend?.Increment();
            var st = host.StatInvoke;
            var sw = st.StartCount();

            // 编码请求,构造消息
            var enc = host.Encoder;
            var msg = enc.CreateRequest(action, args);

            if (flag > 0 && msg is DefaultMessage dm)
            {
                dm.Flag = flag;
            }

            var      invoker = session;
            IMessage rs      = null;

            try
            {
                if (session is IApiSession ss)
                {
                    rs = await ss.SendAsync(msg);
                }
                else if (session is ISocketRemote client)
                {
                    rs = (await client.SendMessageAsync(msg)) as IMessage;
                }
                else
                {
                    throw new InvalidOperationException();
                }

                if (rs == null)
                {
                    return(null);
                }
            }
            catch (AggregateException aggex)
            {
                var ex = aggex.GetTrue();
                if (ex is TaskCanceledException)
                {
                    throw new TimeoutException($"请求[{action}]超时!", ex);
                }
                throw aggex;
            }
            catch (TaskCanceledException ex)
            {
                throw new TimeoutException($"请求[{action}]超时!", ex);
            }
            finally
            {
                var msCost = st.StopCount(sw) / 1000;
                if (host.SlowTrace > 0 && msCost >= host.SlowTrace)
                {
                    host.WriteLog($"慢调用[{action}],耗时{msCost:n0}ms");
                }
            }

            // 特殊返回类型
            if (resultType == typeof(IMessage))
            {
                return(rs);
            }
            //if (resultType == typeof(Packet)) return rs.Payload;

            if (!enc.Decode(rs, out _, out var code, out var data))
            {
                throw new InvalidOperationException();
            }

            // 是否成功
            if (code != 0)
            {
                throw new ApiException(code, $"远程[{invoker}]错误! {data.ToStr()}");
            }

            if (data == null)
            {
                return(null);
            }
            if (resultType == typeof(Packet))
            {
                return(data);
            }

            // 解码结果
            var result = enc.DecodeResult(action, data);

            if (resultType == typeof(Object))
            {
                return(result);
            }

            // 返回
            return(enc.Convert(result, resultType));
        }