Я получаю дополнительный строковый символ, когда я использую GetBody <System.IO.Stream> () для BrokeredMessage, но прекрасно работает с GetBody <string>() c # - PullRequest
0 голосов
/ 03 сентября 2018
    Microsoft.ServiceBus.Messaging.MessageReceiver messageReceiver = messagingFactory.CreateMessageReceiver(                    Microsoft.ServiceBus.Messaging.SubscriptionClient.FormatSubscriptionPath(
                        "TopicName",
                        "SubscriptionName"),
                    Microsoft.ServiceBus.Messaging.ReceiveMode.PeekLock);

 List<BrokeredMessage> brokeredMessages = new List<BrokeredMessage>();
 var messages = messageReceiver.ReceiveBatch(10);
 brokeredMessages.AddRange(messages);

 foreach (var message in messages)              
 var stream = message.GetBody<System.IO.Stream>();
                    var reader = new StreamReader(stream);
                    var body = reader.ReadToEnd();

, который дает неправильный вывод с -

@string3http://schemas.microsoft.com/2003/10/Serialization/�h
{"MyID":"121"}

Когда я использую ниже, он отлично работает -

string body = message.GetBody<string>();

вывод - {"MyID":"121"}

почему это происходит?

1 Ответ

0 голосов
/ 03 сентября 2018

Мне кажется, вы отправляете свои сообщения так:

MyClass myObj = new MyClass { MyID = "121" };
string json = ... // serialize myObj to JSON
var message = new BrokeredMessage(json);

Однако это не отправляет ваш контент как есть. Вы фактически используете эту перегрузку конструктора:

public BrokeredMessage(object serializableObject)

и это делает:

Инициализирует новый экземпляр класса BrokeredMessage из заданного объект с помощью DataContractSerializer с двоичным XmlDictionaryWriter.

Итак, ваша строка сериализуется в XML, а затем форматируется с помощью двоичного форматирования. Это то, что вы видите в содержимом сообщения (пространство имен и некоторые нечитаемые символы).

message.GetBody<string> отлично работает, потому что работает наоборот: десериализует сообщение из двоичного XML.

message.GetBody<Stream> - необработанная операция, поэтому вы получаете необработанные байты.

Чтобы сериализовать контент как есть, вы должны использовать перегрузку конструктора на основе Stream:

var message = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(json)), true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...