Пример #1
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务消费者接收到消息。");
            }

            ManualResetValueTaskSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                if (!string.IsNullOrEmpty(content.ExceptionMessage))
                {
                    task.SetException(new CPlatformCommunicationException(content.ExceptionMessage, content.StatusCode));
                    WirteDiagnosticError(message);
                }
                else
                {
                    task.SetResult(message);
                    WirteDiagnosticAfter(message);
                }
            }
            if (_serviceExecutor != null && message.IsInvokeMessage())
            {
                await _serviceExecutor.ExecuteAsync(sender, message);
            }
        }
Пример #2
0
        public ProtoBufTransportMessage(TransportMessage transportMessage)
        {
            Id          = transportMessage.Id;
            ContentType = transportMessage.ContentType;
            if (transportMessage.IsInvokeMessage())
            {
                Content = SerializerUtilitys.Serialize(
                    new ProtoBufRemoteInvokeMessage(transportMessage.GetContent <RemoteInvokeMessage>()));
            }

            if (transportMessage.IsResultMessage())
            {
                Content = SerializerUtilitys.Serialize(
                    new ProtoBufRemoteResultMessage(transportMessage.GetContent <RemoteResultMessage>()));
            }
        }
Пример #3
0
        public async Task SendAndFlushAsync(TransportMessage message)
        {
            var httpMessage  = message.GetContent <HttpResultMessage <Object> >();
            var actionResult = httpMessage.Data as IActionResult;

            WirteDiagnostic(message);
            if (actionResult == null)
            {
                var text          = _serializer.Serialize(message.Content);
                var data          = Encoding.UTF8.GetBytes(text);
                var contentLength = data.Length;
                _context.Response.Headers.Add("Content-Type", "application/json;charset=utf-8");
                _context.Response.Headers.Add("Content-Length", contentLength.ToString());
                await _context.Response.WriteAsync(text);
            }
            else
            {
                await actionResult.ExecuteResultAsync(new ActionContext
                {
                    HttpContext = _context,
                    Message     = message
                });
            }
            RpcContext.RemoveContext();
        }
Пример #4
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务消费者接收到消息。");
            }

            TaskCompletionSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                //if (!string.IsNullOrEmpty(content.ExceptionMessage))
                //{
                //    task.TrySetException(new CPlatformCommunicationException(content.ExceptionMessage));
                //}
                switch (content.StatusCode)
                {
                case StatusCode.OK:
                    task.SetResult(message);
                    break;

                case StatusCode.CPlatformError:
                    task.TrySetException(new CPlatformException(content.ExceptionMessage));
                    break;

                case StatusCode.BusinessError:
                    task.TrySetException(new BusinessException(content.ExceptionMessage));
                    break;

                case StatusCode.CommunicationError:
                    task.TrySetException(new CPlatformCommunicationException(content.ExceptionMessage));
                    break;

                case StatusCode.DataAccessError:
                    task.TrySetException(new DataAccessException(content.ExceptionMessage));
                    break;

                case StatusCode.ValidateError:
                    task.TrySetException(new ValidateException(content.ExceptionMessage));
                    break;
                //case StatusCode.UnKnownError:
                //    task.TrySetException(new CPlatformException(content.ExceptionMessage));
                //    break;

                default:
                    task.TrySetException(new Exception(content.ExceptionMessage));
                    break;
                }
            }
            if (_serviceExecutor != null && message.IsInvokeMessage())
            {
                await _serviceExecutor.ExecuteAsync(sender, message);
            }
        }
Пример #5
0
 private void WirteDiagnostic(TransportMessage message)
 {
     if (!AppConfig.ServerOptions.DisableDiagnostic)
     {
         var diagnosticListener        = new DiagnosticListener(DiagnosticListenerExtensions.DiagnosticListenerName);
         var remoteInvokeResultMessage = message.GetContent <HttpResultMessage>();
         if (remoteInvokeResultMessage.IsSucceed)
         {
             _diagnosticListener.WriteTransportAfter(TransportType.Rest, new ReceiveEventData(new DiagnosticMessage
             {
                 Content     = message.Content,
                 ContentType = message.ContentType,
                 Id          = message.Id
             }));
         }
         else
         {
             _diagnosticListener.WriteTransportError(TransportType.Rest, new TransportErrorEventData(new DiagnosticMessage
             {
                 Content     = message.Content,
                 ContentType = message.ContentType,
                 Id          = message.Id
             }, new Exception(remoteInvokeResultMessage.Message)));
         }
     }
 }
Пример #6
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            TaskCompletionSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                if (!string.IsNullOrEmpty(content.ExceptionMessage))
                {
                    task.TrySetException(new Exception(content.ExceptionMessage));
                }
                else
                {
                    task.SetResult(message);
                }
            }
            if (message.IsInvokeMessage())
            {
                throw new Exception("message type error");
            }
        }
Пример #7
0
        private async Task MessageListener_Received(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug("接收到消息。");
            }

            TaskCompletionSource <TransportMessage> task;

            if (!_resultDictionary.TryGetValue(message.Id, out task))
            {
                return;
            }

            if (message.IsInvokeResultMessage())
            {
                var content = message.GetContent <RemoteInvokeResultMessage>();
                if (!string.IsNullOrEmpty(content.ExceptionMessage))
                {
                    task.TrySetException(new RpcRemoteException(content.ExceptionMessage));
                }
                else
                {
                    task.SetResult(message);
                }
            }
            if (_serviceExecutor != null && message.IsInvokeMessage())
            {
                await _serviceExecutor.ExecuteAsync(sender, message);
            }
        }
        /// <summary>
        /// 执行。
        /// </summary>
        /// <param name="sender">消息发送者。</param>
        /// <param name="message">调用消息。</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务提供者接收到消息。");
            }

            if (!message.IsHttpMessage())
            {
                return;
            }
            HttpMessage httpMessage;

            try
            {
                httpMessage = message.GetContent <HttpMessage>();
                if (httpMessage.Attachments != null)
                {
                    foreach (var attachment in httpMessage.Attachments)
                    {
                        RpcContext.GetContext().SetAttachment(attachment.Key, attachment.Value);
                    }
                }
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "将接收到的消息反序列化成 TransportMessage<httpMessage> 时发送了错误。");
                return;
            }
            var entry = _serviceEntryLocate.Locate(httpMessage);

            if (entry == null)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.LogError($"根据服务routePath:{httpMessage.RoutePath} - {httpMessage.HttpMethod},找不到服务条目。");
                }
                return;
            }
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug("准备执行本地逻辑。");
            }
            HttpResultMessage <object> httpResultMessage = new HttpResultMessage <object>()
            {
            };

            if (_serviceProvider.IsRegisteredWithKey(httpMessage.ServiceKey, entry.Type))
            {
                //执行本地代码。
                httpResultMessage = await LocalExecuteAsync(entry, httpMessage);
            }
            else
            {
                httpResultMessage = await RemoteExecuteAsync(entry, httpMessage);
            }
            await SendRemoteInvokeResult(sender, httpResultMessage);
        }
        /// <summary>
        /// 执行消息转换后的服务
        /// </summary>
        /// <param name="sender">消息发送者</param>
        /// <param name="message">调用消息</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (!message.IsInvokeMessage())
            {
                return;
            }

            RemoteInvokeMessage remoteInvokeMessage;

            try
            {
                remoteInvokeMessage = message.GetContent <RemoteInvokeMessage>();
            }
            catch (Exception exception)
            {
                _logger.LogError("将接收到的消息反序列化成 TransportMessage<RemoteInvokeMessage> 时发送了错误。", exception);
                return;
            }

            // 定位远程调用的消息服务实体
            var entry = _serviceEntryLocate.Locate(remoteInvokeMessage);

            if (entry == null)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.LogError($"根据服务Id:{remoteInvokeMessage.ServiceId},找不到服务条目");
                }
                return;
            }

            _logger.LogInformation("准备执行本地逻辑");
            var resultMessage = new RemoteInvokeResultMessage();

            // 是否需要等待执行
            if (entry.Descriptor.WaitExecution())
            {
                //执行本地代码
                await LocalExecuteAsync(entry, remoteInvokeMessage, resultMessage);

                //向客户端发送调用结果
                await SendRemoteInvokeResult(sender, message.Id, resultMessage);
            }
            else
            {
                //通知客户端已接收到消息
                await SendRemoteInvokeResult(sender, message.Id, resultMessage);

                //确保新起一个线程执行,不堵塞当前线程
                await Task.Factory.StartNew(async() =>
                {
                    //执行本地代码
                    await LocalExecuteAsync(entry, remoteInvokeMessage, resultMessage);
                },
                                            TaskCreationOptions.LongRunning);
            }
        }
Пример #10
0
        private IDnsQuestion GetDnsQuestion(TransportMessage message)
        {
            if (message.Content != null && !message.IsDnsResultMessage())
            {
                return(null);
            }

            var transportMessage = message.GetContent <DnsTransportMessage>();

            return(transportMessage.DnsQuestion);
        }
Пример #11
0
        private IPAddress GetIpAddr(TransportMessage message)
        {
            if (message.Content != null && !message.IsDnsResultMessage())
            {
                return(null);
            }

            var transportMessage = message.GetContent <DnsTransportMessage>();

            return(transportMessage.Address);
        }
Пример #12
0
        private void WirteDiagnosticError(TransportMessage message)
        {
            var diagnosticListener        = new DiagnosticListener(DiagnosticListenerExtensions.DiagnosticListenerName);
            var remoteInvokeResultMessage = message.GetContent <RemoteInvokeResultMessage>();

            diagnosticListener.WriteTransportError(TransportType.Rpc, new TransportErrorEventData(new DiagnosticMessage
            {
                Content     = message.Content,
                ContentType = message.ContentType,
                Id          = message.Id
            }, new CPlatformCommunicationException(remoteInvokeResultMessage.ExceptionMessage)));
        }
Пример #13
0
        private void WirteDiagnosticAfter(TransportMessage message)
        {
            var diagnosticListener        = new DiagnosticListener(DiagnosticListenerExtensions.DiagnosticListenerName);
            var remoteInvokeResultMessage = message.GetContent <RemoteInvokeResultMessage>();

            diagnosticListener.WriteTransportAfter(TransportType.Rpc, new ReceiveEventData(new DiagnosticMessage
            {
                Content     = message.Content,
                ContentType = message.ContentType,
                Id          = message.Id
            }));
        }
Пример #14
0
        /// <summary>
        /// 执行。
        /// </summary>
        /// <param name="sender">消息发送者。</param>
        /// <param name="message">调用消息。</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务提供者接收到消息。");
            }

            if (!message.IsHttpMessage())
            {
                return;
            }
            HttpMessage httpMessage;

            try
            {
                httpMessage = message.GetContent <HttpMessage>();
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "将接收到的消息反序列化成 TransportMessage<httpMessage> 时发送了错误。");
                return;
            }
            var entry = _serviceEntryLocate.Locate(httpMessage);

            if (entry == null)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.LogError($"根据服务routePath:{httpMessage.RoutePath},找不到服务条目。");
                }
                return;
            }
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug("准备执行本地逻辑。");
            }
            if (_serviceProvider.IsRegisteredWithKey(httpMessage.ServiceKey, entry.Type))
            {
                HttpResultMessage <object> httpResultMessage = new HttpResultMessage <object>();
                //执行本地代码。
                await LocalExecuteAsync(entry, httpMessage, httpResultMessage);

                //向客户端发送调用结果。
                await SendRemoteInvokeResult(sender, httpResultMessage);
            }
            else
            {
                HttpResultMessage <object> httpResultMessage = new HttpResultMessage <object>();
                await RemoteExecuteAsync(entry, httpMessage, httpResultMessage);
                await SendRemoteInvokeResult(sender, httpResultMessage);
            }
        }
Пример #15
0
        private void WirteDiagnosticBefore(TransportMessage message)
        {
            var diagnosticListener  = new DiagnosticListener(DiagnosticListenerExtensions.DiagnosticListenerName);
            var remoteInvokeMessage = message.GetContent <RemoteInvokeMessage>();

            diagnosticListener.WriteTransportBefore(TransportType.Rpc, new TransportEventData(new DiagnosticMessage
            {
                Content     = message.Content,
                ContentType = message.ContentType,
                Id          = message.Id,
                MessageName = remoteInvokeMessage.ServiceId
            }, remoteInvokeMessage.DecodeJOject?RpcMethod.Json_Rpc.ToString():RpcMethod.Proxy_Rpc.ToString(), RpcContext.GetContext().GetAttachment("RemoteAddress")?.ToString()));
        }
Пример #16
0
 private void WirteDiagnosticError(TransportMessage message)
 {
     if (!AppConfig.ServerOptions.DisableDiagnostic)
     {
         var remoteInvokeResultMessage = message.GetContent <RemoteInvokeResultMessage>();
         _diagnosticListener.WriteTransportError(TransportType.Rpc, new TransportErrorEventData(new DiagnosticMessage
         {
             Content     = message.Content,
             ContentType = message.ContentType,
             Id          = message.Id
         }, new CPlatformCommunicationException(remoteInvokeResultMessage.ExceptionMessage)));
     }
 }
Пример #17
0
 private void WirteDiagnosticAfter(TransportMessage message)
 {
     if (!AppConfig.ServerOptions.DisableDiagnostic)
     {
         var remoteInvokeResultMessage = message.GetContent <RemoteInvokeResultMessage>();
         _diagnosticListener.WriteTransportAfter(TransportType.Rpc, new ReceiveEventData(new DiagnosticMessage
         {
             Content     = message.Content,
             ContentType = message.ContentType,
             Id          = message.Id
         }));
     }
 }
Пример #18
0
        private void WirteDiagnosticBefore(TransportMessage message)
        {
            var diagnosticListener  = new DiagnosticListener(DiagnosticListenerExtensions.DiagnosticListenerName);
            var remoteInvokeMessage = message.GetContent <HttpMessage>();

            diagnosticListener.WriteTransportBefore(TransportType.Rest, new TransportEventData(new DiagnosticMessage
            {
                Content     = message.Content,
                ContentType = message.ContentType,
                Id          = message.Id,
                MessageName = remoteInvokeMessage.RoutePath
            }, TransportType.Rest.ToString(), RpcContext.GetContext().GetAttachment("RemoteIpAddress")?.ToString()));
        }
Пример #19
0
        public ProtoBufferTransportMessage(TransportMessage transportMessage)
        {
            Id          = transportMessage.Id;
            ContentType = transportMessage.ContentType;

            object contentObject;

            if (transportMessage.IsInvokeMessage())
            {
                contentObject = new ProtoBufferRemoteInvokeMessage(transportMessage.GetContent <RemoteInvokeMessage>());
            }
            else if (transportMessage.IsInvokeResultMessage())
            {
                contentObject = new ProtoBufferRemoteInvokeResultMessage(transportMessage.GetContent <RemoteInvokeResultMessage>());
            }
            else
            {
                throw new NotSupportedException($"无法支持的消息类型:{ContentType}!");
            }

            Content = SerializerUtilitys.Serialize(contentObject);
        }
        private IByteBuffer GetByteBuffer(TransportMessage message, out int contentLength)
        {
            contentLength = 0;
            if (!message.IsHttpResultMessage())
            {
                return(null);
            }

            var httpResultMessage = message.GetContent <HttpResultMessage>();
            var data = Encoding.UTF8.GetBytes(_serializer.Serialize(httpResultMessage));

            contentLength = data.Length;
            return(Unpooled.WrappedBuffer(data));
        }
Пример #21
0
 private void WirteDiagnosticError(TransportMessage message)
 {
     if (!AppConfig.ServerOptions.DisableDiagnostic)
     {
         var diagnosticListener        = new DiagnosticListener(DiagnosticListenerExtensions.DiagnosticListenerName);
         var remoteInvokeResultMessage = message.GetContent <RemoteInvokeResultMessage>();
         diagnosticListener.WriteTransportError(TransportType.Mqtt, new TransportErrorEventData(new DiagnosticMessage
         {
             Content     = message.Content,
             ContentType = message.ContentType,
             Id          = message.Id
         }, new Exception(remoteInvokeResultMessage.ExceptionMessage)));
     }
 }
Пример #22
0
        /// <summary>
        /// execute as an asynchronous operation.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="message">The message.</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务提供者接收到消息。");
            }

            if (!message.IsHttpMessage())
            {
                return;
            }

            HttpRequestMessage httpMessage;

            try
            {
                httpMessage = message.GetContent <HttpRequestMessage>();
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "将接收到的消息反序列化成 TransportMessage<httpMessage> 时发送了错误。");
                return;
            }

            if (httpMessage.Attachments != null)
            {
                foreach (var attachment in httpMessage.Attachments)
                {
                    RpcContext.GetContext().SetAttachment(attachment.Key, attachment.Value);
                }
            }

            WirteDiagnosticBefore(message);
            var entry = _serviceEntryLocate.Locate(httpMessage);

            var httpResultMessage = new HttpResultMessage <object>();

            if (entry != null && _serviceProvider.IsRegisteredWithKey(httpMessage.ServiceKey, entry.Type))
            {
                //执行本地代码。
                httpResultMessage = await LocalExecuteAsync(entry, httpMessage);
            }
            else
            {
                httpResultMessage = await RemoteExecuteAsync(httpMessage);
            }

            await SendRemoteInvokeResult(sender, message.Id, httpResultMessage);
        }
Пример #23
0
        public async Task <RemoteInvokeResultMessage> InvokerAsync(TransportMessage message)
        {
            if (!message.IsInvokeMessage())
            {
                return(null);
            }

            RemoteInvokeMessage remoteInvokeContext;

            try
            {
                remoteInvokeContext = message.GetContent <RemoteInvokeMessage>();
            }
            catch (Exception exception)
            {
                _logger.LogError("将接收到的消息反序列化成 TransportMessage<RemoteInvokeMessage> 时发送了错误。", exception);
                return(null);
            }
            var resultMessage = new RemoteInvokeResultMessage();

            try
            {
                var entry  = _entryLocator.Locate(remoteInvokeContext.ServiceId);
                var result = await entry.Func(remoteInvokeContext.Parameters);

                var task = result as Task;

                if (task == null)
                {
                    resultMessage.Result = result;
                }
                else
                {
                    task.Wait();

                    var taskType = task.GetType().GetTypeInfo();
                    if (taskType.IsGenericType)
                    {
                        resultMessage.Result = taskType.GetProperty("Result").GetValue(task);
                    }
                }
            }
            catch (Exception e)
            {
                _logger.LogError("执行本地服务调用发生错误", e);
                resultMessage.ExceptionMessage = GetExceptionMessage(e);
            }
            return(resultMessage);
        }
Пример #24
0
 private void WirteDiagnosticBefore(TransportMessage message, string address, string traceId, PacketType packetType)
 {
     if (!AppConfig.ServerOptions.DisableDiagnostic)
     {
         var remoteInvokeMessage = message.GetContent <RemoteInvokeMessage>();
         _diagnosticListener.WriteTransportBefore(TransportType.Mqtt, new TransportEventData(new DiagnosticMessage
         {
             Content     = message.Content,
             ContentType = message.ContentType,
             Id          = message.Id,
             MessageName = remoteInvokeMessage.ServiceId
         }, packetType.ToString(),
                                                                                             traceId, address));
     }
 }
Пример #25
0
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            var rtmpMessages = message.GetContent <Dictionary <StreamName, AbstractRtmpMessage> >();

            foreach (var rtmpMediaMessage in rtmpMessages)
            {
                await _rtmpRemoteInvokeService.InvokeAsync(
                    new RemoteInvokeMessage
                {
                    Attachments = RpcContext.GetContext().GetContextParameters(),
                    ServiceId   = _publishServiceId,
                    Parameters  = new Dictionary <string, object>()
                    {
                        { "key", rtmpMediaMessage.Key },
                        { "message", rtmpMediaMessage.Value }
                    }
                }, CPlatform.AppConfig.ServerOptions.ExecutionTimeoutInMilliseconds);
            }
        }
Пример #26
0
        private void WirteDiagnosticBefore(TransportMessage message)
        {
            if (!AppConfig.ServerOptions.DisableDiagnostic)
            {
                var remoteInvokeMessage = message.GetContent <RemoteInvokeMessage>();
                remoteInvokeMessage.Attachments.TryGetValue("TraceId", out object traceId);
                _diagnosticListener.WriteTransportBefore(TransportType.Rpc, new TransportEventData(new DiagnosticMessage
                {
                    Content     = message.Content,
                    ContentType = message.ContentType,
                    Id          = message.Id,
                    MessageName = remoteInvokeMessage.ServiceId
                }, remoteInvokeMessage.DecodeJOject ? RpcMethod.Json_Rpc.ToString() : RpcMethod.Proxy_Rpc.ToString(),
                                                                                                   traceId?.ToString(),
                                                                                                   RpcContext.GetContext().GetAttachment("RemoteAddress")?.ToString()));
            }
            var parameters = RpcContext.GetContext().GetContextParameters();

            parameters.TryRemove("RemoteAddress", out object value);
            RpcContext.GetContext().SetContextParameters(parameters);
        }
Пример #27
0
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (!message.IsHttpMessage())
            {
                return;
            }
            HttpMessage httpMessage;

            try
            {
                httpMessage = message.GetContent <HttpMessage>();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message + "将接收到的消息反序列化成 TransportMessage<httpMessage> 时发送了错误。");
                return;
            }
            //if (httpMessage.Attachments != null)
            //{
            //    foreach (var attachment in httpMessage.Attachments)
            //        RpcContext.GetContext().SetAttachment(attachment.Key, attachment.Value);
            //}
            WirteDiagnosticBefore(message);
            var entry = _serviceEntryLocate.Locate(httpMessage);

            HttpResultMessage <object> httpResultMessage = new HttpResultMessage <object>()
            {
            };

            if (entry != null)
            {
                //执行本地代码。
                httpResultMessage = await LocalExecuteAsync(entry, httpMessage);
            }
            else
            {
                //httpResultMessage = await RemoteExecuteAsync(httpMessage);
            }
            await SendRemoteInvokeResult(sender, message.Id, httpResultMessage);
        }
Пример #28
0
        /// <summary>
        /// 执行。
        /// </summary>
        /// <param name="sender">消息发送者。</param>
        /// <param name="message">调用消息。</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("服务提供者接收到消息。");
            }


            byte[] udpMessage = null;
            try
            {
                if (message.IsUdpDispatchMessage())
                {
                    udpMessage = message.GetContent <byte[]>();
                }
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "将接收到的消息反序列化成 TransportMessage<byte[]> 时发送了错误。");
                return;
            }

            var entry = _udpServiceEntryProvider.GetEntry();

            if (entry == null)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.LogError("未实现UdpBehavior实例。");
                }
                return;
            }

            if (udpMessage != null)
            {
                await LocalExecuteAsync(entry, udpMessage);
            }

            await SendRemoteInvokeResult(sender, udpMessage);
        }
Пример #29
0
 private void WirteDiagnosticBefore(TransportMessage message)
 {
     if (!AppConfig.ServerOptions.DisableDiagnostic)
     {
         RpcContext.GetContext().SetAttachment("TraceId", message.Id);
         var remoteInvokeMessage = message.GetContent <HttpMessage>();
         _diagnosticListener.WriteTransportBefore(TransportType.Rest, new TransportEventData(new DiagnosticMessage
         {
             Content     = message.Content,
             ContentType = message.ContentType,
             Id          = message.Id,
             MessageName = remoteInvokeMessage.RoutePath
         }, TransportType.Rest.ToString(),
                                                                                             message.Id,
                                                                                             RestContext.GetContext().GetAttachment("RemoteIpAddress")?.ToString()));
     }
     else
     {
         var parameters = RpcContext.GetContext().GetContextParameters();
         RpcContext.GetContext().SetContextParameters(parameters);
     }
 }
        public async Task SendAsync(TransportMessage message)
        {
            var actionResult = message.GetContent <IActionResult>();

            if (actionResult == null)
            {
                var text          = _serializer.Serialize(message, true);
                var data          = Encoding.UTF8.GetBytes(_serializer.Serialize(text));
                var contentLength = data.Length;
                _context.Response.Headers.Add("Content-type", "application/json");
                _context.Response.Headers.Add("Content-Length", contentLength.ToString());
                await _context.Response.WriteAsync(text);
            }
            else
            {
                await actionResult.ExecuteResultAsync(new ActionContext
                {
                    HttpContext = _context,
                    Message     = message
                });
            }
        }