Ejemplo n.º 1
0
 public RpcTransportErrorResponse(
     string correlationMessageId, IRpcMessageSenderContext senderContext, Exception errorInfo)
 {
     this.CorrelationMessageId = correlationMessageId;
     this.SenderContext        = senderContext;
     this.ErrorInfo            = errorInfo;
 }
        private bool dispatchCommand(
            ServiceUniqueNameInfo commandUniqueName, IRpcMessageSenderContext context, string requestMessageContent,
            out RemoteServiceBusResponseContext responseContext, out string responseMessageContent, out WindServiceBusRpcException rpcException)
        {
            // 创建响应上下文
            responseMessageContent = null;
            rpcException           = null;
            responseContext        = new RemoteServiceBusResponseContext();
            context.FillRemoteContext(responseContext);

            // 通过RPC框架执行远程调用
            try
            {
                RpcTransportMessageRequest requestMessage = new RpcTransportMessageRequest(MessageIdGenerator.CreateMessageId())
                {
                    ServiceUniqueName = commandUniqueName,
                    MessageHeader     = new RpcTransportMessageHeader
                    {
                        //TODO: 其他消息头
                    },
                    MessageContent = requestMessageContent,
                };
                RpcTransportMessageResponse responseMessage = this.rpcServerManager.SendMessage(requestMessage, context);

                //响应上下文
                if (responseMessage != null)
                {
                    responseContext.FillRemoteContext(responseMessage.MessageHeader);   //服务响应信息填入RemoteContext
                }

                //响应消息验证
                if (responseMessage == null || responseMessage.CorrelationMessageId == null ||
                    responseMessage.CorrelationMessageId != requestMessage.MessageId ||
                    responseMessage.MessageContent == null)
                {
                    throw new WindServiceBusException(string.Format("request [{0}] get error response !", requestMessage.MessageId));
                }

                if (responseMessage.ResponseCode != RpcTransportResponseCode.Success)
                {
                    throw new WindServiceBusException(string.Format("request [{0}] get error response: {1}", requestMessage.MessageId, responseMessage.ErrorInfo));
                }

                responseMessageContent = responseMessage.MessageContent;
                return(true);    //请求成功
            }
            catch (Exception serviceBusException)
            {
                this._logger.Error("WindServiceBusException: " + commandUniqueName, serviceBusException);
                rpcException = new WindServiceBusRpcException(responseContext, serviceBusException);

                return(false);   //请求失败
            }
        }
        private ExpoMessageSenderContext validateExpoSenderContext(IRpcMessageSenderContext requestContext)
        {
            //获取请求目标上下文
            var context = requestContext as ExpoMessageSenderContext;

            if (context == null)
            {
                throw new WindServiceBusException("request context type error!");
            }
            if (context.TargetAppClassId <= 0)
            {
                throw new WindServiceBusException("target expo AppClassId shouled not be empty!");
            }
            if (context.TargetCommandId <= 0)
            {
                throw new WindServiceBusException("target expo CommandId shouled not be empty!");
            }
            return(context);
        }
        public RpcTransportMessageResponse SendMessage(RpcTransportMessageRequest request, IRpcMessageSenderContext requestContext)
        {
            this.validateMessage(request);
            var context = this.validateExpoSenderContext(requestContext);

            return(this.sendMessageCore(request, context));
        }
Ejemplo n.º 5
0
 /// <summary>
 /// 发送RPC请求并获取响应
 /// </summary>
 public RpcTransportMessageResponse SendMessage(RpcTransportMessageRequest request, IRpcMessageSenderContext requestContext)
 {
     return(this.MessageSender.SendMessage(request, requestContext));
 }
Ejemplo n.º 6
0
        /// <summary>
        /// 发送RPC消息
        /// </summary>
        /// <param name="serviceName">服务名称</param>
        /// <param name="request">请求消息</param>
        /// <returns>响应消息</returns>
        public RpcTransportMessageResponse SendMessage(RpcTransportMessageRequest request, IRpcMessageSenderContext rpcContext)
        {
            IRpcServer rpcServer = rpcServers.FirstOrDefault(server => server.RpcType == rpcContext.RpcType);

            return(rpcServer.SendMessage(request, rpcContext));
        }