0
    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();

which gives wrong output with -

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

When I use below it works perfect -

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

output - {"MyID":"121"}

why this happens ?

4

1 回答 1

2

我的猜测是,这就是您发送消息的方式:

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

但是,这不会按原样发送您的内容。您实际上正在使用此构造函数重载:

public BrokeredMessage(object serializableObject)

它确实:

通过使用带有二进制 XmlDictionaryWriter 的 DataContractSerializer 从给定对象初始化 BrokeredMessage 类的新实例。

因此,您的字符串被序列化为 XML,然后使用二进制格式进行格式化。这就是您在消息内容中看到的内容(命名空间和一些不可读的字符)。

message.GetBody<string>工作正常,因为它做相反的事情:它反序列化来自二进制 XML 的消息。

message.GetBody<Stream>是原始操作,因此您得到原始字节。

要按原样序列化内容,您应该使用Stream基于 - 的构造函数重载:

var message = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(json)), true);
于 2018-09-03T08:16:22.433 回答