Ejemplo n.º 1
0
        /// <summary>
        /// Отправить сообщение.
        /// </summary>
        /// <param name="message">Сообщение, которое нужно отправить.</param>
        /// <returns>Успешно ли было отправлено сообщение.</returns>
        public bool SendMessage(Message message)
        {
            if (string.IsNullOrEmpty(Client.Address))
            {
                _logger.LogError("Ошибка отправки сообщения клиенту через WCF", $"У клиента '{Client.Name ?? Client.ID}' не указан адрес для отправки сообщений.", message);
                return(false);
            }

            var channelFactory = new ChannelFactory <ICallbackSubscriber>(
                "CallbackClient",
                Client.DnsIdentity != null ? new EndpointAddress(new Uri(Client.Address), EndpointIdentity.CreateDnsIdentity(Client.DnsIdentity)) : new EndpointAddress(Client.Address));
            ICallbackSubscriber channel = channelFactory.CreateChannel();

            ((IClientChannel)channel).Open();

            MessageFromESB messageFromEsb = ServiceHelper.CreateWcfMessageFromEsb(
                message.ReceivingTime,
                message.MessageType.ID,
                message.Body,
                message.Sender,
                message.Group,
                ServiceHelper.GetTagDictionary(message),
                message.BinaryAttachment);

            return(ServiceHelper.TryWithExceptionLogging(
                       () => channel.AcceptMessage(messageFromEsb),
                       () => {
                ((IClientChannel)channel).Close();
                channelFactory.Close();
            },
                       string.Format("Ошибка отправки сообщения клиенту через WCF по адресу {0}", Client.Address),
                       Client,
                       message,
                       _logger));
        }
        /// <summary>
        /// Отправить сообщение.
        /// </summary>
        /// <param name="message">Сообщение, которое нужно отправить.</param>
        /// <returns>Успешно ли было отправлено сообщение.</returns>
        public bool SendMessage(Flexberry.ServiceBus.Message message)
        {
            if (string.IsNullOrEmpty(Client.Address))
            {
                _logger.LogError(
                    "Ошибка отправки сообщения клиенту через веб-сервис",
                    $"У клиента '{Client.Name ?? Client.ID}' не указан адрес для отправки сообщений.",
                    message);
                return(false);
            }

            var channelFactory =
                new ChannelFactory <ICallbackSubscriber>(
                    new BasicHttpBinding(),
                    new EndpointAddress(
                        new Uri(Client.Address),
                        AddressHeader.CreateAddressHeader("headerName", Regex.Replace(Client.Address, ".asmx$", string.Empty), "headerValue")));

            ICallbackSubscriber channel = channelFactory.CreateChannel();

            ((IClientChannel)channel).Open();

            MessageFromESB messageFromEsb = ServiceHelper.CreateWcfMessageFromEsb(
                message.ReceivingTime,
                message.MessageType.ID,
                message.Body,
                message.Sender,
                message.Group,
                ServiceHelper.GetTagDictionary(message),
                message.BinaryAttachment);

            return(ServiceHelper.TryWithExceptionLogging(() => channel.AcceptMessage(messageFromEsb), null, null, null, null, _logger));
        }
        static void Main(string[] args)
        {
            string adaptersCommand = "";

            while (adaptersCommand != "exit")
            {
                using (var ServiceBus = new ServiceBus.ServiceBusServiceClient())
                {
                    string serviceID     = ConfigurationManager.AppSettings["ServiceID4SB"];
                    string messageTypeID = ConfigurationManager.AppSettings["MessageTypeID"];

                    //Получить все адресованные сообщения (при запуске).
                    MessageFromESB message = ServiceBus.GetMessageFromESB(serviceID, messageTypeID);
                    Console.WriteLine(message.Body);

                    // Получить новые сообщения/выйти из приложения.
                    Console.WriteLine("Enter \"get\" for get a message (for exit type \"exit\"):");
                    adaptersCommand = Console.ReadLine();

                    while (message != null)
                    {
                        // Получить новый список сообщений через команду "get".
                        message = ServiceBus.GetMessageFromESB(serviceID, messageTypeID);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        public void TestCallBackServiceAcceptToMsrFromReestrMspCatalogItemsResponseMessage()
        {
            using (new FakeHttpContext())
            {
                var pathToXML = Path.Combine(HttpRuntime.AppDomainAppPath,
                                             $"{Context.XMLMessagePath}{ToMsrFromReestrMspCatalogItemsResponse.NameForESB}.xml");
                var xmlTemplateDoc = new XmlDocument();
                xmlTemplateDoc.Load(pathToXML);
                var xmlStringMsg = xmlTemplateDoc.InnerXml;

                var msg = new MessageFromESB
                {
                    MessageTypeID = ToMsrFromReestrMspCatalogItemsResponse.NameForESB,
                    Body          = xmlStringMsg,
                    SenderName    = "TestSender"
                };

                var cb = new CallbackSubscriber();
                try
                {
                    cb.AcceptMessage(msg);
                }
                catch (Exception ex)
                {
                    Assert.Fail($"Произошло неожиданное исключение - {ex.Message}");
                }
            }
        }
Ejemplo n.º 5
0
        static void Main(string[] args)
        {
            var messageFromESB = new MessageFromESB();

            MyServiceHost.StartService();

            Console.WriteLine("MsgListener started.");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();

            MyServiceHost.StopService();
        }
        /// <inheritdoc/>
        public override bool SendMessage(Message message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (string.IsNullOrEmpty(Client.Address))
            {
                Logger.LogError("Error sending message to client via WEB.", $"The client '{Client.Name ?? Client.ID}' not specified address to send messages.", message);
                return(false);
            }

            ChannelFactory <ICallbackSubscriber> channelFactory;
            ICallbackSubscriber channel;

            try
            {
                var endpointAddress = new EndpointAddress(new Uri(Client.Address), AddressHeader.CreateAddressHeader("headerName", Regex.Replace(Client.Address, ".asmx$", string.Empty), "headerValue"));
                channelFactory = new ChannelFactory <ICallbackSubscriber>(new BasicHttpBinding(), endpointAddress);
                channel        = channelFactory.CreateChannel();
                ((IClientChannel)channel).Open();
            }
            catch (Exception exception)
            {
                Logger.LogUnhandledException(exception, message);
                throw exception;
            }

            var sbMessage = new MessageFromESB()
            {
                MessageFormingTime = message.ReceivingTime,
                MessageTypeID      = message.MessageType.ID,
                Body       = message.Body,
                Attachment = message.BinaryAttachment,
                SenderName = message.Sender,
                GroupID    = message.Group,
                Tags       = ServiceHelper.GetTagDictionary(message),
            };

            return(ServiceHelper.TryWithExceptionLogging(
                       () => channel.AcceptMessage(sbMessage),
                       () =>
            {
                ((IClientChannel)channel).Close();
                channelFactory.Close();
            },
                       $"Error sending message to the client '{Client.Name ?? Client.ID}' via WEB at address '{Client.Address}'.",
                       Client,
                       message,
                       Logger));
        }
Ejemplo n.º 7
0
        public void TestAcceptMessage()
        {
            // Arrange.
            const string clientId      = "Client1";
            const string senderId      = "Client2";
            const string messageTypeId = "messageType1";
            const string groupId       = "Group1";
            var          message       = new MessageFromESB
            {
                GroupID       = groupId,
                MessageTypeID = messageTypeId,
                Body          = "Сообщение для шины",
                Tags          = new Dictionary <string, string>(),
                SenderName    = senderId
            };

            message.Tags["sendingWay"] = clientId;

            // Act & Assert.
            fixture.ServiceBus.AcceptMessage(message);
            fixture.RecManager.Verify(
                rec =>
                rec.AcceptMessage(
                    It.Is <ServiceBusMessage>(
                        msg =>
                        msg.ClientID == clientId && msg.MessageTypeID == messageTypeId &&
                        msg.Body == message.Body && msg.Tags["senderName"] == senderId), groupId),
                Times.Once);

            message.GroupID = string.Empty;
            fixture.ServiceBus.AcceptMessage(message);
            fixture.RecManager.Verify(
                rec =>
                rec.AcceptMessage(
                    It.Is <ServiceBusMessage>(
                        msg =>
                        msg.ClientID == clientId && msg.MessageTypeID == messageTypeId &&
                        msg.Body == message.Body && msg.Tags["senderName"] == senderId)),
                Times.Once);
        }
        public void TestCreateWcfMessageFromEsb()
        {
            // Arrange.
            var          formTime            = DateTime.Now;
            const string messageTypeId       = "03FE3B98-2D09-4032-A5BF-03BEDF86F4F4";
            const string msgBody             = "TestBody";
            const string senderName          = "Sender's name";
            const string groupId             = "715A8124-A154-485B-83AC-6EE6BA7A9470";
            Dictionary <string, string> tags = new Dictionary <string, string> {
                { "testTag", "tag" }
            };

            byte[] attachment = Encoding.Unicode.GetBytes(msgBody);

            // Act.
            MessageFromESB msg = ServiceHelper.CreateWcfMessageFromEsb(formTime, messageTypeId, msgBody, senderName, groupId, tags, attachment);

            // Assert.
            Assert.True(msg.MessageFormingTime == formTime && msg.MessageTypeID == messageTypeId && msg.Body == msgBody &&
                        msg.SenderName == senderName && msg.GroupID == groupId && msg.Tags == tags &&
                        msg.Attachment == attachment);
        }
Ejemplo n.º 9
0
        public void TestCallBackServiceUnknowMessageEx()
        {
            var msg = new MessageFromESB
            {
                MessageTypeID = "TestUnknowTypeMessage",
                Body          = "",
                SenderName    = "TestSender"
            };

            try
            {
                var cb = new CallbackSubscriber();
                cb.AcceptMessage(msg);
            }
            catch (UnknowMessageTypeException)
            {
                throw;
            }
            catch (Exception ex)
            {
                Assert.Fail($"Произошло неожиданное исключение - {ex.Message}");
            }
        }
Ejemplo n.º 10
0
 public void AcceptMessage(MessageFromESB msg)
 {
     Console.WriteLine(msg.Body);
 }
Ejemplo n.º 11
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);
            }
        }