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; }
/// <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); }
/// <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)); } }