Пример #1
0
        private async Task ProfermAsync(IInvocation invocation)
        {
            var targetType = invocation.TargetType.IsInterface ?
                             invocation.TargetType : invocation.TargetType.GetInterfaces()[0];
            var request = new MethodRpcRequest
            {
                TargetType   = targetType,
                TargetMethod = invocation.MethodInvocationTarget,
                Params       = invocation.Arguments
            };
            var response = await _rpcClient.InvokeMethodAsync(request);

            if (response.Status == -1)
            {
                if (response.Exception != null)
                {
                    throw response.Exception;
                }
                else
                {
                    throw new System.Exception("RPC调用异常");
                }
            }
            invocation.ReturnValue = response.ReturnData;
        }
Пример #2
0
        /// <summary>
        /// 处理单个请求
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <MethodRpcResponse> Process(MethodRpcRequest request)
        {
            var response = new MethodRpcResponse();

            if (request == null)
            {
                response.Status    = -1;
                response.Exception = new ArgumentNullException(nameof(request));
                return(response);
            }
            var service = _serviceProvider.GetService(request.TargetType);

            if (service == null)
            {
                response.Status    = -1;
                response.Exception = new InvalidOperationException("远程方法不存在");
                return(response);
            }
            var methodInfo = request.TargetMethod;
            var result     = methodInfo.Invoke(service, request.Params);

            response.Status     = 1;
            response.ReturnData = result;
            response.ReturnType = methodInfo.ReturnType;
            return(response);
        }
Пример #3
0
        /// <summary>
        /// 发送RPC请求
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <MethodRpcResponse> InvokeMethodAsync(MethodRpcRequest request)
        {
            IFormatter formatter = new BinaryFormatter();

            using (var ms = new MemoryStream())
            {
                formatter.Serialize(ms, request);
                var response = await _tcpClient.TakeResponseAsync(ms.ToArray());

                ms.Position = 0;
                await ms.WriteAsync(response.ToArray(), 0, response.Length);

                return((MethodRpcResponse)formatter.Deserialize(ms));
            }
        }