예제 #1
0
파일: RPCServer.cs 프로젝트: zyj0021/CRL5
        internal ResponseMessage InvokeResult(RequestMessage request)
        {
            var response = new ResponseMessage();

            try
            {
                var a = serviceHandle.TryGetValue(request.Service, out object service);
                if (!a)
                {
                    throw new Exception("未找到该服务");
                }
                if (tokenCheck != null)
                {
                    var tokenArry = request.Token.Split('@');
                    if (tokenArry.Length < 2)
                    {
                        throw new Exception("token不合法");
                    }
                    if (!tokenCheck(tokenArry[0], tokenArry[1]))
                    {
                        throw new Exception("token验证失败");
                    }
                }
                var methodKey = string.Format("{0}.{1}", request.Service, request.Method);
                a = methods.TryGetValue(methodKey, out MethodInfo method);
                if (!a)
                {
                    var serviceType = service.GetType();
                    method = serviceType.GetMethod(request.Method);
                    if (method == null)
                    {
                        throw new Exception("未找到该方法");
                    }
                    methods.TryAdd(methodKey, method);
                }
                var paramters       = request.Args;
                var methodParamters = method.GetParameters();
                var outs            = new Dictionary <string, object>();
                int i = 0;
                foreach (var p in methodParamters)
                {
                    var find = paramters.TryGetValue(p.Name, out object value);
                    if (find && value != null)
                    {
                        if (value.GetType() != p.ParameterType)
                        {
                            var value2 = value.ToJson().ToObject(p.ParameterType);
                            paramters[p.Name] = value2;
                        }
                    }
                    else
                    {
                        paramters[p.Name] = null;
                    }
                    if (p.Attributes == ParameterAttributes.Out)
                    {
                        outs.Add(p.Name, i);
                    }
                    i += 1;
                }
                var args3  = paramters?.Select(b => b.Value)?.ToArray();
                var result = method.Invoke(service, args3);
                foreach (var kv in new Dictionary <string, object>(outs))
                {
                    var value = args3[(int)kv.Value];
                    outs[kv.Key] = value;
                }
                response.SetData(result);
                response.Success = true;
                response.Outs    = outs;
            }
            catch (Exception ex)
            {
                response.Success = false;
                response.Msg     = ex.Message;
                Console.WriteLine(ex.ToString());
            }

            return(response);
        }