Beispiel #1
0
        /// <summary>
        ///     Принять сообщение из шины.
        /// </summary>
        /// <param name="message">Сообщение.</param>
        public void AcceptMessage([MessageParameter(Name = "msg")] MessageFromESB message)
        {
            LogService.LogInfo($"BusListenerService: Принял соообщение - {message.MessageTypeID}!");

            // Ищем в конфиг файле, привязку между типов сообщения и xml-классом этого сообщения.
            var xmlClassName = Context.GetMessageXMLClassNameByMessageID(message.MessageTypeID);

            if (!string.IsNullOrEmpty(xmlClassName))
            {
                // Получаем тип по названию класса из конфиг файла.
                var messageType = Type.GetType(xmlClassName);
                if (messageType != null)
                {
                    try
                    {
                        ICommonMessage messageObj = null;
                        if (!string.IsNullOrEmpty(message.Body))
                        {
                            // Проверка валидация по XSD-схеме полученного xml.
                            if (Context.EnableXSDValidation)
                            {
                                var pathToXSD = Path.Combine(HttpRuntime.AppDomainAppPath,
                                                             $"{Context.XSDSchemasPath}{message.MessageTypeID}.xsd");
                                if (File.Exists(pathToXSD))
                                {
                                    XMLTools.CheckXMLFromStringtoXSD(message.Body, pathToXSD);
                                }
                                else
                                {
                                    LogService.LogWarn(
                                        $"BusListenerService: При получении сообщения включена проверка валидности сообщения XSD-схеме, но XSD-схема для сообщения типа {message.MessageTypeID} не найдена!{Environment.NewLine} Путь для ожидаемой XSD-схемы - {pathToXSD}");
                                }
                            }

                            // Десериализуем сообщение для его сохранения.
                            messageObj =
                                SerializationTools.DeserialiseDataContract(messageType, message.Body) as ICommonMessage;
                        }

                        if (messageObj != null)
                        {
                            // Сохранение сообщения в SyncLogItem.
                            messageObj.Save(message.SenderName, message.Body, true);
                        }
                        else
                        {
                            LogService.LogWarn(
                                $"BusListenerService: Получено пустое сообщение типа {message.MessageTypeID}. Сообщение не будет сохранено в БД!");
                        }
                    }
                    catch (XmlSchemaValidationException ex)
                    {
                        LogService.LogError(
                            $"{MessageErrorHeader} Не пройдена валидация XSD-схемы для сообщения типа {message.MessageTypeID}",
                            ex);
                        throw;
                    }
                    catch (Exception ex)
                    {
                        LogService.LogError($"{MessageErrorHeader}", ex);
                        throw;
                    }
                }
                else
                {
                    var errorMessage =
                        $"{MessageErrorHeader} Не найден XML-класс типа сообщения с названием {xmlClassName}";
                    LogService.LogError(errorMessage);
                    throw new InvalidOperationException(errorMessage);
                }
            }
            else
            {
                var errorMessage =
                    $"{MessageErrorHeader} Неизвестный тип сообщения - {message.MessageTypeID}. Проверьте настройки секции {Context.CustomSBListenerConfigSectionName} в конфигурационном файле.";
                LogService.LogError(errorMessage);
                throw new UnknowMessageTypeException(errorMessage);
            }
        }