gpt4 book ai didi

c# - 当 ReplyTo 是临时队列时检索异常

转载 作者:行者123 更新时间:2023-11-30 23:11:19 24 4
gpt4 key购买 nike

我们的应用程序使用临时队列将服务总线响应定向到原始调用方。我们使用内置的 ServiceStack.RabbitMq.RabbitMqServer 来发布和处理消息。

Message<IReturn<ResponseDto>> message = BuildMessage(requestDto);

// get the temporary queue for the current IMessageQueueClient
string queueName = messageclient.GetTempQueueName();
message.ReplyTo = queueName;

// publish the message
messageclient.Publish(message);

但是,如果调用抛出异常,直接捕获响应(如下)将失败。

IMessage<ResponseDto> responseMessage = messageclient.Get<ResponseDto>(queueName, timeOut);
messageclient.Ack(responseMessage);

ResponseDto response = responseMessage.GetBody();

响应消息的主体将是一个 ServiceStack.ErrorResponse 导致 responseMessage.GetBody() 返回一个空对象。错误不会作为 responseMessage.Error 返回。

我们通过将消息正文作为原始 JSV 字符串获取并验证结果来解决这个问题。

IMessage<string> responseMessage = messageclient.Get<string>(queueName, timeOut);
messageclient.Ack(responseMessage);

// get the body of the message as a string
string messageBody = responseMessage.GetBody();

// parse as error response
var error = messageBody.FromJsv<ErrorResponse>();

// if no response status, assume good
if (error?.ResponseStatus != null)
throw new Exception(error.ResponseStatus.Message);

// parse as response and return
return messageBody.FromJsv<ResponseDto>();

这适用于大多数情况,但是,如果返回的 RabbitMq 消息 JSON 中的字符串值包含逗号,则该字符串不包含在消息正文 JSV 的引号中(这似乎是 ServiceStack 中的一个问题。使用 JsonTypeSerializer 从 JSON -> JSV 转换时的文本) 这会导致该字段不完整,并忽略后续字段。

是否有更好的方法来检索异常?或者是否有序列化问题的解决方法?

最佳答案

不应该将 JSON 转换为 JSV,它们是不同的格式。 JSV 使用 CSV 风格的编码和转义,这在 JSON 中是非法的,JSON 要求所有字符串值都被引用并且字符串用 \ 转义。

本质上,您应该使用用于序列化它的确切序列化器和类型来反序列化消息,如果您这样做,应该不会有任何问题。

ServiceStack's Rabbit MQ支持将复杂类型的有效负载序列化为 JSON,因此不清楚 JSV 的来源。

如果您需要访问原始文本负载,您应该使用 Rabbit MQ 的低级 API 而不是 ServiceStack 的 RabbitMQ 高级 API,后者会自动尝试在幕后反序列化复杂类型的消息。

要获取原始文本正文,您可以执行以下操作:

var rabbitMqClient = messageclient as RabbitMqProducer;
var mqResult = rabbitMqClient.GetMessage(queueName, noAck: false);
var props = msgResult.BasicProperties;
var bodyString = msgResult.Body.FromUtf8Bytes(); //normally JSON

关于c# - 当 ReplyTo 是临时队列时检索异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44782067/

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