Exemplo n.º 1
0
        private async Task <RemoteInvokeResponse> InvokeMethod(MethodInfo methodInfo, Object instance, object[] parameters)
        {
            var result = methodInfo.Invoke(instance, parameters.ToArray());

            if (methodInfo.ReturnType == typeof(void) || methodInfo.ReturnType == typeof(Task))
            {
                return(RemoteInvokeResponse.CreateSuccess(null));
            }
            object resultObj;

            if (result.GetType().IsGenericType&& result.GetType().GetGenericTypeDefinition() == typeof(Task <>))
            {
                if (result.GetType().GetGenericArguments().Count() > 1)
                {
                    return(RemoteInvokeResponse.CreateFail("不支持多个泛型参数的方法"));
                }

                var task = (Task)result;
                await task.ConfigureAwait(false);

                resultObj = task.GetType().GetProperty("Result").GetValue(task);
            }
            else
            {
                resultObj = result;
            }
            if (resultObj == null)
            {
                return(RemoteInvokeResponse.CreateSuccess(null));
            }
            else
            {
                return(RemoteInvokeResponse.CreateSuccess(serializer.Serialize(resultObj)));
            }
        }
Exemplo n.º 2
0
        private async Task SendAsync(IChannel <Package> channel, RemoteInvokeResponse res, Guid id)
        {
            var response = RemoteInvokeTransport <RemoteInvokeResponse> .CreateResponse(id, res);

            var resData = serializer.Serialize(response);
            var package = new Package
            {
                Type = PackageType.Transfer,
                Data = resData
            };
            await channel.SendAsync(package);
        }
Exemplo n.º 3
0
        private async Task OnRemoteInvokeRequest(IChannel <Package> channel, RemoteInvokeTransport <RemoteInvokeRequest> request)
        {
            logger.LogDebug($"服务端接受到一个数据包:{request.Content}");
            var id            = request.Id;
            var invokeRequest = request.Content;

            var type = RpcServiceLocator.ServiceAssembly.GetType(invokeRequest.FullTypeName);

            if (type == null)
            {
                await SendAsync(channel, RemoteInvokeResponse.CreateFail("没有发现对应服务"), id);

                return;
            }

            var instance = RpcServiceLocator.Instance.GetService(type);

            if (instance == null)
            {
                await SendAsync(channel, RemoteInvokeResponse.CreateFail("没有找到实现类"), id);

                return;
            }
            var method = type.GetMethods().SingleOrDefault(x =>
            {
                if (x.Name != invokeRequest.MethodName)
                {
                    return(false);
                }
                var identity = x.GetMethodIdentity();
                return(identity == invokeRequest.ParameterIdentity);
            });

            if (method == null)
            {
                await SendAsync(channel, RemoteInvokeResponse.CreateFail("没有找到具体方法"), id);

                return;
            }

            var parameters       = new List <object>();
            var methodParameters = method.GetParameters();

            for (int i = 0; i < methodParameters.Length; i++)
            {
                var data  = serializer.Serialize(invokeRequest.Parameters[i]);
                var param = serializer.Deserialize(data, methodParameters[i].ParameterType);
                parameters.Add(param);
            }

            if (method.IsGenericMethod)
            {
                await SendAsync(channel, RemoteInvokeResponse.CreateFail("不支持泛型方法"), id);

                return;
            }

            var result = await InvokeMethod(method, instance, parameters.ToArray());

            await SendAsync(channel, result, id);
        }