Ребус помещает странные символы в JAD-словарь HEADER, написанный в MSMQ Extension Property

У меня есть приложение, которое пишет сообщение с использованием шаблона публикации / подписчика с реализацией Rebus. В какой-то момент, без каких-либо изменений кода, Ребус начал писать двоичное содержимое Расширения MSMQ с некоторыми странными символами после содержимого JSON, вот пример одного принятого сообщения с проблемой:

{ "Rbs2-намерения":"паб","rbs2-сообщ-идентификатор":"ac543d60-e28c-49bb-8783-b5c6574a90ea","rbs2-возвратного адрес":"myqueuename@SERVERNAME","rbs2-senttime":"2018-04-26T00:20:48.0453055-03:00","rbs2-корр-идентификатор":"ac543d60-e28c-49bb-8783-b5c6574a90ea","rbs2-корр-сл":"0","rbs2-msg-type":"ClassNamespace.BusinessClassName, ClassNamespace","rbs2-content-type":"application/json;charset=utf-8","rbs2-content-encoding":"gzip"}?k? ч?3??? / Мас??

Вот полное сообщение об ошибке, которое я получаю в лог-файле lof4net, написанное Rebus при получении сообщения от MSMQ.

2018-05-03 10: 33: 49,516 WARN Rebus.Workers.ThreadPoolBased.ThreadPoolWorker - Произошла ошибка при попытке получить следующее сообщение: System.Runtime.Serialization.SerializationException: Не удалось десериализовать текст JSON '{"rbs2-intent":"паб","rbs2-сообщ-идентификатор":"ac543d60-e28c-49bb-8783-b5c6574a90ea","rbs2-возвратного адрес":"myqueuename @ SERVERNAME","rbs2-senttime":"2018-04- 26T00: 20: 48.0453055-03: 00","rbs2-корр-идентификатор":"ac543d60-e28c-49bb-8783-b5c6574a90ea","rbs2-корр-сл":"0","rbs2-тзд типа":"ClassNamespace.BusinessClassName, ClassNamespace","rbs2-content-type":"application / json; charset = utf-8","rbs2-content-encoding":"gzip"}? K? H?3??? /?? W R?? Newtonsoft.Json.JsonReaderException: дополнительный текст, встречающийся после завершения чтения содержимого JSON: . Path '', строка 1, позиция 432. в Newtonsoft.Json.JsonTextReader.Read() в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(считыватель JsonReader, тип objectType, логический checkAdditionalContent) в Newtonsoft.Json.JsonSerializer.Deserializer читатель, введите objectType) в Newtonsoft.Json.JsonConvert.DeserializeObject(строковое значение, тип Type, настройки JsonSerializerSettings) в Newtonsoft.Json.JsonConvert.DeserializeObject[T](строковое значение, настройки JsonSerializerSettings) в Rebus.Serializer.Stringize.Dring String str) --- Конец внутренней трассировки стека исключений --- в Rebus.Serialization.HeaderSerializer.DeserializeFromString(String str) в Rebus.Msmq.MsmqTransport.d__15.MoveNext() --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача) в Rebus.Workers.ThreadPoolBased.ThreadPoolWorker.d__17.MoveNext()

Через некоторое время, углубившись в эту проблему, мне удалось выполнить дизассемблирование реализации Rebus для класса MSMQ "MsmqTransport", и я смог увидеть, как Rebus взаимодействует с MSMQ, а также как свойство Extension заполняется двоичными данными Encoding.UTF8.GetBytes.

Что мне не понятно, так это как Encoding.UTF8.GetBytes(JsonConvert.Serialize(Dictionary<string,string>)) может привести к тому, что испортил массив байтов.

Я полагаю, что на эту реализацию Rebus MsmqTransport для MSMQ не может повлиять мой код, ни объект, который я отправляю в MSMQ, в котором он будет размещен в теле сообщения, а не в двоичном расширении, или, как я м его настраиваю.

В качестве обходного пути, чтобы все решения работали, я реализовал сервис, в котором просматривает сообщение из MSMQ, выполняет байты свойства Encoding.UTF8.GetString из Exteions, анализирует его, исправляет его в случае странных символов и извлекает он возвращается (исправный JSON) в свойство Extension, затем удаляет его из MSMQ и возвращает его обратно в MSMQ, поэтому реальный процесс, использующий Rebus (подписчик), сможет получить его должным образом.

Есть ли способ узнать, как Ребус портит двоичные данные, записанные в свойстве Extension сообщения MSMQ!?

Вот как я настраиваю Rebus при реализации Publisher:

Bus = Configure.With(activator)
                       .Logging(l => l.Trace())
                       .Options(o =>
                                {
                                    o.SimpleRetryStrategy(Config.ErrorQueue, Config.MaxDeliveryAttempts == 0 ? 3 : Config.MaxDeliveryAttempts);
                                    if (Config.EnableCompression)
                                        o.EnableCompression();
                                })
                       .Transport(t => t.UseMsmq(Config.PublisherQueue))
                       .Subscriptions(s => s.Register(c => SubscriptionStorage))
                       .Start();

Большое спасибо.

1 ответ

Это звучит очень странно!

Как вы правильно поняли, то, как Ребус заполняет Extension собственность MSMQ Message не оставляет столько места для странных ошибок и забавного поведения, как то, что вы испытываете.

Однажды я использовал Rebus на сайте клиента, и в течение долгого времени все работало нормально, но внезапно, даже без каких-либо изменений кода, странные вещи начали появляться в Extension часть наших сообщений MSMQ тоже очень похожа на то, что вы видите.

После долгих размышлений и потрясений мы выяснили, что наш заказчик нанял другую компанию, чтобы помочь им с общим мониторингом производительности и прочим, и одна из их инициатив заключалась в том, чтобы использовать Extension свойство сообщений MSMQ, связанное с заголовками Ребуса, тем самым нарушая все.

Я не знаю, является ли это "стандартной практикой MSMQ", или почему они просто начинают портить наши сообщения, даже не спрашивая нас, будет ли это проблемой, но, может быть, это может быть чем-то похожим в вашем случае?

Если нет, у меня нет никаких улик.

Другие вопросы по тегам