gpt4 book ai didi

c# - 当我将 GetBody() 用于 BrokeredMessage 时,我得到了额外的字符串字符,但与 GetBody() c# 完美配合

转载 作者:行者123 更新时间:2023-12-03 05:47:38 25 4
gpt4 key购买 nike

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

关于c# - 当我将 GetBody<System.IO.Stream>() 用于 BrokeredMessage 时,我得到了额外的字符串字符,但与 GetBody<string>() c# 完美配合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52145433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com