Example #1
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            try
            {
                if (channel == null || !channel.Open)
                {
                    channel = Core.AsyncInvoke.RunSync(() => bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(HostAddress.address), HostAddress.port)));
                    //channel = bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(HostAddress.address), HostAddress.port)).Result;
                }
            }
            catch (Exception ero)
            {
                ThrowError("连接服务端失败:" + ero, "500");
            }
            var id     = Guid.NewGuid().ToString();
            var method = ServiceType.GetMethod(binder.Name);

            allWaits.Add(id);
            var request = new RequestMessage
            {
                MsgId   = id,
                Service = ServiceName,
                Method  = binder.Name,
                //Token = clientConnect.Token.Token
            };
            var dic     = new List <byte[]>();
            var allArgs = method.GetParameters();

            for (int i = 0; i < allArgs.Length; i++)
            {
                var p = allArgs[i];
                dic.Add(Core.BinaryFormat.FieldFormat.Pack(p.ParameterType, args[i]));
            }
            request.Args = dic;
            var token = request.Token;

            request.Token = CreateAccessToken(allArgs, args.ToList(), clientConnect.TokenInfo);
            var             pollyAttr = serviceInfo.GetAttribute <PollyAttribute>();
            ResponseMessage response  = null;

            var pollyData = PollyExtension.Invoke(pollyAttr, () =>
            {
                channel.WriteAndFlushAsync(request.ToBuffer());
                //等待返回
                var res = allWaits.Wait(id).Response;
                return(new PollyExtension.PollyData <ResponseMessage>()
                {
                    Data = res
                });
            }, $"{ServiceName}.{method.Name}");

            response = pollyData.Data;
            if (!string.IsNullOrEmpty(pollyData.Error))
            {
                ThrowError(pollyData.Error, "500");
            }

            if (response == null)
            {
                ThrowError("请求超时未响应", "500");
            }
            if (!response.Success)
            {
                ThrowError($"服务端处理错误:{response.Msg}", response.GetData(typeof(string)) + "");
            }
            var returnType = method.ReturnType;

            if (response.Outs != null && response.Outs.Count > 0)
            {
                foreach (var kv in response.Outs)
                {
                    var index = kv.Key;
                    var type  = allArgs[index];
                    //args[(int)find] = kv.Value;
                    int offSet = 0;
                    args[index] = Core.BinaryFormat.FieldFormat.UnPack(type.ParameterType, kv.Value, ref offSet);
                }
            }
            if (!string.IsNullOrEmpty(response.Token))
            {
                clientConnect.TokenInfo.Token = response.Token;
            }
            if (returnType == typeof(void))
            {
                result = null;
                return(true);
            }
            var  generType = returnType;
            bool isTask    = false;

            if (returnType.Name.StartsWith("Task`1"))
            {
                generType = returnType.GenericTypeArguments[0];
                isTask    = true;
            }
            result = response.GetData(generType);
            if (isTask)
            {
                //返回Task类型
                var method2 = typeof(Task).GetMethod("FromResult", BindingFlags.Public | BindingFlags.Static);
                var result2 = method2.MakeGenericMethod(new Type[] { generType }).Invoke(null, new object[] { result });
                result = result2;
            }
            return(true);
        }
Example #2
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            try
            {
                if (channel == null || !channel.Open)
                {
                    channel = Core.AsyncInvoke.RunSync(() => bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(HostAddress.address), HostAddress.port)));
                }
            }
            catch (Exception ero)
            {
                ThrowError("连接服务端失败:" + ero, "500");
            }
            var id     = Guid.NewGuid().ToString();
            var method = ServiceType.GetMethod(binder.Name);

            allWaits.Add(id);
            var request = new RequestMessage
            {
                MsgId   = id,
                Service = ServiceName,
                Method  = binder.Name,
                //Token = clientConnect.Token.Token
            };
            var dic     = new List <byte[]>();
            var allArgs = method.GetParameters();

            for (int i = 0; i < allArgs.Length; i++)
            {
                var p = allArgs[i];
                dic.Add(Core.BinaryFormat.FieldFormat.Pack(p.ParameterType, args[i]));
            }
            request.Args = dic;
            var token = request.Token;

            request.Token = CreateAccessToken(allArgs, args.ToList(), clientConnect.TokenInfo);

            channel.WriteAndFlushAsync(request.ToBuffer());
            //等待返回
            var response = allWaits.Wait(id).Response;

            if (response == null)
            {
                ThrowError("请求超时未响应", "500");
            }
            if (!response.Success)
            {
                ThrowError($"服务端处理错误:{response.Msg}", response.GetData(typeof(string)) + "");
            }
            var returnType = method.ReturnType;

            if (response.Outs != null && response.Outs.Count > 0)
            {
                foreach (var kv in response.Outs)
                {
                    var index = kv.Key;
                    var type  = allArgs[index];
                    //args[(int)find] = kv.Value;
                    int offSet = 0;
                    args[index] = Core.BinaryFormat.FieldFormat.UnPack(type.ParameterType, kv.Value, ref offSet);
                }
            }
            if (!string.IsNullOrEmpty(response.Token))
            {
                clientConnect.TokenInfo.Token = response.Token;
            }
            if (returnType == typeof(void))
            {
                result = null;
                return(true);
            }
            result = response.GetData(returnType);
            return(true);
        }
Example #3
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            try
            {
                if (channel == null || !channel.Open)
                {
                    channel = AsyncInvoke.RunSync(() => bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(Host), Port)));
                }
            }
            catch (Exception ero)
            {
                throw new Exception("连接服务端失败:" + ero);
            }
            var id     = Guid.NewGuid().ToString();
            var method = ServiceType.GetMethod(binder.Name);

            allWaits.Add(id);
            var request = new RequestMessage
            {
                MsgId   = id,
                Service = ServiceName,
                Method  = binder.Name,
                Token   = Token
            };
            var dic     = new Dictionary <string, object>();
            var allArgs = method.GetParameters();
            var outs    = new Dictionary <string, object>();

            for (int i = 0; i < allArgs.Length; i++)
            {
                var p = allArgs[i];
                dic.Add(p.Name, args[i]);
                if (p.Attributes == ParameterAttributes.Out)
                {
                    outs.Add(p.Name, i);
                }
            }
            request.Args = dic;
            channel.WriteAndFlushAsync(request.ToBuffer());
            //等待返回
            var response = allWaits.Wait(id).Response;

            if (response == null)
            {
                throw new Exception("请求超时未响应");
            }
            if (!response.Success)
            {
                throw new Exception($"服务端处理错误:{response.Msg}");
            }
            var returnType = method.ReturnType;

            if (response.Outs != null && response.Outs.Count > 0)
            {
                foreach (var kv in response.Outs)
                {
                    var find = outs[kv.Key];
                    args[(int)find] = kv.Value;
                }
            }
            if (returnType == typeof(void))
            {
                result = null;
                return(true);
            }
            result = response.GetData(returnType);
            return(true);
        }