当我将 GetBody<System.IO.Stream>() 用于 BrokeredMessage 但与 GetBody<string>() c# 完美配合时,我得到了额外的字符串字符
I'm getting extra string char when I use GetBody<System.IO.Stream>() for BrokeredMessage but works perfect with GetBody<string>() c#
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"}
为什么会这样?
我猜这就是您发送消息的方式:
MyClass myObj = new MyClass { MyID = "121" };
string json = ... // serialize myObj to JSON
var message = new BrokeredMessage(json);
但是,这不会按原样发送您的内容。您实际上正在使用此构造函数重载:
public BrokeredMessage(object serializableObject)
确实如此:
Initializes a new instance of the BrokeredMessage class from a given
object by using DataContractSerializer with a binary
XmlDictionaryWriter.
因此,您的字符串被序列化为 XML,然后使用二进制格式进行格式化。这就是您在消息内容中看到的内容(命名空间和一些不可读的字符)。
message.GetBody<string>
工作正常,因为它做相反的事情:它反序列化来自二进制 XML.
的消息
message.GetBody<Stream>
是原始操作,因此您得到原始字节。
要按原样序列化内容,您应该使用基于 Stream
的构造函数重载:
var message = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(json)), true);
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"}
为什么会这样?
我猜这就是您发送消息的方式:
MyClass myObj = new MyClass { MyID = "121" };
string json = ... // serialize myObj to JSON
var message = new BrokeredMessage(json);
但是,这不会按原样发送您的内容。您实际上正在使用此构造函数重载:
public BrokeredMessage(object serializableObject)
确实如此:
Initializes a new instance of the BrokeredMessage class from a given object by using DataContractSerializer with a binary XmlDictionaryWriter.
因此,您的字符串被序列化为 XML,然后使用二进制格式进行格式化。这就是您在消息内容中看到的内容(命名空间和一些不可读的字符)。
message.GetBody<string>
工作正常,因为它做相反的事情:它反序列化来自二进制 XML.
message.GetBody<Stream>
是原始操作,因此您得到原始字节。
要按原样序列化内容,您应该使用基于 Stream
的构造函数重载:
var message = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(json)), true);