Example #1
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));
        }
Example #2
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));
        }