Мне нужно отправить объект XMLDocument в MSMQ. У меня нет класса для его десериализации (xml может отличаться). Средство форматирования по умолчанию, XMLMessageFormatter, будет "красиво печатать" объект. Это вызывает проблему, поскольку
<text></text>
Будет преобразовано в
<text>
</text>
(т.е. cr + пробелы). Сообщение читается процессом, использующим формат XMLMessageFormatter по умолчанию, и не вызывает проблем, пока в узлах есть данные. Однако это проблема в дальнейшем, так как процесс (находящийся вне моего контроля) будет интерпретировать эти новые символы как данные и вызовет ошибку.
Я знаю, что мог бы написать некоторый код для их преобразования с использованием IsEmpty = true, дающего <text />
, но мне нужно решение, которое вообще не изменяет объект.
BinaryMessageFormatter будет префикс данных с данными BOM (получатель этого не ожидает), а ActiveXMessageFormatter будет удваивать байт строки (снова вызывая проблемы на другом конце).
Я бы предпочел избежать написания собственного средства форматирования сообщений. Я попытался включить некоторые параметры в XMLMessageFormatter, но они мало что дали. Любые идеи будут очень признательны.
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);
Результирующее сообщение:
@StephenMaitland, я не могу воспроизвести такое поведение. Я добавил пример кода в ответ - Body
и Formatter
игнорируются, если вы используете BodyStream
.
Ах, вот и все, я не использовал массив байтов. Помечен как принятый.
К сожалению, если форматировщик не указан, по умолчанию применяется XmlMessageFormat, несмотря на то, что предлагается в документации даже при использовании BodyStream. Итак,
<root><test></test></root>
приводит к<root>.. <test>.. </test>..</root>
(CR и пробелы вставлены)