Отправить XML-сообщение в MSMQ без какого-либо форматирования

Мне нужно отправить объект XMLDocument в MSMQ. У меня нет класса для его десериализации (xml может отличаться). Средство форматирования по умолчанию, XMLMessageFormatter, будет "красиво печатать" объект. Это вызывает проблему, поскольку

<text></text>

Будет преобразовано в

<text>

</text>

(т.е. cr + пробелы). Сообщение читается процессом, использующим формат XMLMessageFormatter по умолчанию, и не вызывает проблем, пока в узлах есть данные. Однако это проблема в дальнейшем, так как процесс (находящийся вне моего контроля) будет интерпретировать эти новые символы как данные и вызовет ошибку.

Я знаю, что мог бы написать некоторый код для их преобразования с использованием IsEmpty = true, дающего <text />, но мне нужно решение, которое вообще не изменяет объект.

BinaryMessageFormatter будет префикс данных с данными BOM (получатель этого не ожидает), а ActiveXMessageFormatter будет удваивать байт строки (снова вызывая проблемы на другом конце).

Я бы предпочел избежать написания собственного средства форматирования сообщений. Я попытался включить некоторые параметры в XMLMessageFormatter, но они мало что дали. Любые идеи будут очень признательны.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
773
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

MSMQ работает с необработанными большими двоичными объектами. Вам не нужно использовать форматтер, если вы не хотите.

Чтобы отправить сообщение и вернуть его байт в байт, используйте свойство BodyStream.

Пример:

var queue = new MessageQueue(@".\private$\queueName");
var msg = new Message();
msg.BodyStream = new MemoryStream(Encoding.UTF8.GetBytes("<root><test></test></root>"));
queue.Send(msg);

Результирующее сообщение:

К сожалению, если форматировщик не указан, по умолчанию применяется XmlMessageFormat, несмотря на то, что предлагается в документации даже при использовании BodyStream. Итак, <root><test></test></root> приводит к <root>.. <test>.. </test>..</root> (CR и пробелы вставлены)

Stephen Maitland 12.12.2020 02:40

@StephenMaitland, я не могу воспроизвести такое поведение. Я добавил пример кода в ответ - Body и Formatter игнорируются, если вы используете BodyStream.

Mitch 12.12.2020 08:07

Ах, вот и все, я не использовал массив байтов. Помечен как принятый.

Stephen Maitland 14.12.2020 02:43

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