/// <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)); }
/// <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; }
/// <summary>开始会话处理</summary> public override void Start() { base.Start(); //_Host = this.GetService<IApiHost>(); _Host = Host.Provider as ApiServer; }
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); }
/// <summary>开始会话处理</summary> public override void Start() { base.Start(); _Host = Host.Host; if (_Host is ApiHost host) { host.OnNewSession(this, null); } }
/// <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="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"); } } }
/// <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); }
/// <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="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); } }
/// <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); }
/// <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()); }
/// <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()); }
/// <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()); }
internal ApiHostCatalog(IApiHost host, ApiMembers src) { Host = host; Members = src; }
/// <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)); }
/// <summary>开始会话处理</summary> public override void Start() { base.Start(); _ApiHost = this.GetService <IApiHost>(); }
/// <summary>开始会话处理</summary> public override void Start() { base.Start(); _Host = Host.Host; }
/// <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)); }
/// <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)); }
/// <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)); }