gpt4 book ai didi

azure - 消息正文不能被多次读取。要重用它,请在读取后存储该值

转载 作者:行者123 更新时间:2023-12-04 14:26:01 26 4
gpt4 key购买 nike

我已经创建了使用带有损坏消息的 QueueClient.Receive() 来获取队列客户端数据的代码

BrokeredMessage deadmessage = client.Receive();
byte[] dataRaw = deadmessage.GetBody<byte[]>();

由于一些损坏的数据,我在第二行得到异常,同时获取损坏的消息的正文。所以我尝试使用 SteamReader 获取 catch block 上的消息正文。

Stream stream = deadmessage.GetBody<Stream>();
StreamReader reader = new StreamReader(stream);

我遇到了以下异常,有人可以帮助我进行适当的修复吗?

异常详细信息:

消息正文不能被多次读取。要重用它,请在读取后存储该值。

最佳答案

要多次尝试读取消息正文,您需要首先将其作为流读取

serviceBusClient.GetBody<Stream>()

然后你可以尝试用不同的方式来解释它。例如可以通过以下方式直接序列化:

var brokeredMessage = new BrokeredMessage(message);
serviceBusClient.Send(brokeredMessage);

但最好先序列化为json。

var brokeredMessage = new BrokeredMessage(JsonConvert.SerializeObject(message));
serviceBusClient.Send(brokeredMessage);

在我看来,它更安全,因为 json 序列化会忽略消息类型的命名空间,因此当您将消息类移动到另一个命名空间时,您不会中断进程。

假设您开始发送和读取以 json 序列化的消息,但一些旧消息仍然可以是二进制序列化的。在这种情况下,您可以使用以下逻辑:

    public static T DeserializeMessage<T>(BrokeredMessage brokeredMessage)
{
using (var stream = brokeredMessage.GetBody<Stream>())
using (var streamReader = new StreamReader(stream))
{
string bodyText = streamReader.ReadToEnd();
try
{
return JsonConvert.DeserializeObject<T>(bodyText);
}
catch (JsonReaderException)
{
stream.Position = 0;
var reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max);
var serializer = new DataContractSerializer(typeof(T));
var msgBody = (T)serializer.ReadObject(reader);
return msgBody;
}
}
}

如果您需要尝试将消息反序列化为另一种类型,请在 serializer.ReadObject(reader) 上捕获 System.Runtime.Serialization.SerializationException

关于azure - 消息正文不能被多次读取。要重用它,请在读取后存储该值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43841204/

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