/// <summary>
        /// Called when [action executing].
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        public async Task OnActionExecuting(ActionExecutingContext filterContext)
        {
            var serviceEntry = _serviceEntryLocate.Locate(filterContext.Message);

            if (serviceEntry != null)
            {
                var httpMethods = serviceEntry.Methods;
                if (httpMethods.Count() > 0 &&
                    !httpMethods.Any(p => string.Compare(p, filterContext.Context.Request.Method, true) == 0))
                {
                    filterContext.Result = new HttpResultMessage <object>
                    {
                        IsSucceed  = false,
                        StatusCode = Http405EndpointStatusCode,
                        Message    = Http405EndpointDisplayName
                    };
                }
            }
            else
            {
                var serviceRoute = await _serviceRouteProvider.GetRouteByPath(filterContext.Message.RoutePath);

                var httpMethods = serviceRoute.ServiceDescriptor.HttpMethod();
                if (!string.IsNullOrEmpty(httpMethods) && !httpMethods.Contains(filterContext.Context.Request.Method))
                {
                    filterContext.Result = new HttpResultMessage <object>
                    {
                        IsSucceed  = false,
                        StatusCode = Http405EndpointStatusCode,
                        Message    = Http405EndpointDisplayName
                    };
                }
            }
        }
        /// <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);
            }
        }
Пример #4
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);
            }
        }
Пример #5
0
        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;
            }
            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 && _serviceProvider.IsRegisteredWithKey(httpMessage.ServiceKey, entry.Type))
            {
                //执行本地代码。
                httpResultMessage = await LocalExecuteAsync(entry, httpMessage);
            }
            else
            {
                httpResultMessage = await RemoteExecuteAsync(httpMessage);
            }
            await SendRemoteInvokeResult(sender, message.Id, httpResultMessage);
        }
Пример #6
0
        public async Task OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.Context.Response.OnStarting(async() =>
            {
                var options          = AppConfig.Options;
                var transferContract = filterContext.Route.ServiceDescriptor.GetTransferContract();
                if (transferContract != null)
                {
                    var option = options.Where(p => p.Name == transferContract.Name).FirstOrDefault();
                    if (option != null)
                    {
                        var routePath = string.IsNullOrEmpty(option.RoutePath) ? transferContract.RoutePath : option.RoutePath;

                        var address      = new StringBuilder(option.Endpoint);
                        address          = address.Append(routePath);
                        var serviceEntry = _serviceEntryLocate.Locate(filterContext.Message);
                        if (serviceEntry != null)
                        {
                            var parameters = new Dictionary <string, object>();
                            foreach (var parameterInfo in serviceEntry.Parameters)
                            {
                                var value         = filterContext.Message.Parameters[parameterInfo.Name];
                                var parameterType = parameterInfo.ParameterType;
                                var parameter     = _typeConvertibleService.Convert(value, parameterType);
                                parameters.Add(parameterInfo.Name, _typeConvertibleService.Convert(value, parameterType));
                            }
                            try
                            {
                                var result = await ServiceLocator.GetService <ITransportClient>(transferContract.Type.ToString()).SendAsync(address.ToString(),
                                                                                                                                            parameters, filterContext.Context);
                                await new MessageSender(_serializer, filterContext.Context).SendAndFlushAsync(result, GetContentType(transferContract.Type));
                            }
                            catch (Exception ex)
                            {
                                var i = 0;
                            }
                        }
                    }
                }
            });
        }
Пример #7
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);
        }
        public  async Task OnActionExecuting(ActionExecutingContext filterContext)
        { 
            var serviceEntry= _serviceEntryLocate.Locate(filterContext.Message);
            if (serviceEntry != null)
            {
                var httpMethods = serviceEntry.Methods;
                if (httpMethods.Count()>0 && !httpMethods.Any(p => String.Compare(p, filterContext.Context.Request.Method, true) == 0))
                {
                    filterContext.Result = new HttpResultMessage<object>
                    {
                        IsSucceed = false,
                        StatusCode = Http405EndpointStatusCode,
                        Message = Http405EndpointDisplayName
                    };
                }
            }
            else
            {
                var path = HttpUtility.UrlDecode(GetRoutePath(filterContext.Context.Request.Path.ToString()));
                path = AppConfig.MapRoutePathOptions.GetRoutePath(path, filterContext.Message.HttpMethod);
                var serviceRoute = await _serviceRouteProvider.GetRouteByPathOrRegexPath(path, filterContext.Message.HttpMethod);
                if (serviceRoute == null)
                {
                    throw new CPlatformException($"未能找到路径为{path}-{filterContext.Message.HttpMethod}的路由信息", StatusCode.Http404EndpointStatusCode);
                }

                var httpMethods = serviceRoute.ServiceDescriptor.HttpMethod();
                if (httpMethods != null && !httpMethods.Contains(filterContext.Context.Request.Method))
                {
                    filterContext.Result = new HttpResultMessage<object>
                    {
                        IsSucceed = false,
                        StatusCode = Http405EndpointStatusCode,
                        Message = Http405EndpointDisplayName
                    };
                }
            }
        }
Пример #9
0
        /// <summary>
        /// 执行。
        /// </summary>
        /// <param name="sender">消息发送者。</param>
        /// <param name="message">调用消息。</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Information))
            {
                _logger.LogInformation("接收到消息。");
            }

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

            RemoteInvokeMessage remoteInvokeMessage;

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

            var entry = _serviceEntryLocate.Locate(remoteInvokeMessage);

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

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


            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug("准备执行本地逻辑。");
            }

            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
        /// <summary>
        /// 执行。
        /// </summary>
        /// <param name="sender">消息发送者。</param>
        /// <param name="message">调用消息。</param>
        public async Task ExecuteAsync(IMessageSender sender, TransportMessage message)
        {
            if (_logger.IsEnabled(LogLevel.Information))
            {
                _logger.Information("接收到消息。");
            }

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

            RemoteInvokeMessage remoteInvokeMessage;

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

            var entry = _serviceEntryLocate.Locate(remoteInvokeMessage);

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

            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.Debug("准备执行本地逻辑。");
            }

            var resultMessage = new RemoteInvokeResultMessage();

            try
            {
                var result = entry.Func(remoteInvokeMessage.Parameters);
                var task   = result as Task;

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

                    var taskType = task.GetType();
                    if (taskType.IsGenericType)
                    {
                        resultMessage.Result = taskType.GetProperty("Result").GetValue(task);
                    }
                }
            }
            catch (Exception exception)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.Error("执行本地逻辑时候发生了错误。", exception);
                }
                resultMessage.ExceptionMessage = GetExceptionMessage(exception);
            }

            try
            {
                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.Debug("准备发送响应消息。");
                }

                await sender.SendAsync(TransportMessage.CreateInvokeResultMessage(message.Id, resultMessage));

                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.Debug("响应消息发送成功。");
                }
            }
            catch (Exception exception)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.Error("发送响应消息时候发生了异常。", exception);
                }
            }
        }