使用阿里MNS主题,订阅时设置为简单格式(NotifyContentFormat.SIMPLIFIED),收到的消息仍然是XML格式的。
string queueName = "queue-123456";
try
{
var queue = client.CreateQueue(queueName);
// var res = topic.Subscribe(_subscriptionName, topic.GenerateQueueEndpoint(queueName));
var res = topic.Subscribe(new SubscribeRequest(_subscriptionName, topic.GenerateQueueEndpoint(queueName),NotifyStrategy.BACKOFF_RETRY,NotifyContentFormat.SIMPLIFIED));
topic.PublishMessage("this is the message 05-811888");
ReceiveMessageResponse resp = queue.ReceiveMessage(30);
queue.DeleteMessage(new DeleteMessageRequest() {
ReceiptHandle= resp.Message.ReceiptHandle
});
Console.WriteLine(resp.Message.Body);
XmlDocument doc = new XmlDocument();
doc.LoadXml(resp.Message.Body);
XmlElement element = doc.DocumentElement;
XmlNodeList nodeList=element.GetElementsByTagName("Message");
if(nodeList.Count==1)
{
string message= nodeList[0].InnerText;
}
}
catch (Exception ex)
{
Console.WriteLine("Subscribe failed, exception info: " + ex.Message);
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据用户描述,使用阿里云MNS主题订阅时,设置了消息格式为NotifyContentFormat.SIMPLIFIED
,但实际接收到的消息仍然是XML格式。这表明可能存在以下几种情况:
NotifyContentFormat
参数可能未正确设置或未被正确应用。以下是基于知识库资料的详细解答和解决方案。
在创建订阅时,NotifyContentFormat
参数用于指定消息推送的格式。根据知识库文档,NotifyContentFormat
支持以下三种格式: - SIMPLIFIED
:仅包含用户发布的消息正文,不包含任何属性信息。 - JSON
:包含消息正文和消息属性,以JSON格式返回。 - XML
:包含消息正文和消息属性,以XML格式返回。
如果希望接收到的消息为简单格式(SIMPLIFIED
),需要确保在调用Subscribe
接口时,明确指定了NotifyContentFormat.SIMPLIFIED
。例如:
var res = topic.Subscribe(new SubscribeRequest(
_subscriptionName,
topic.GenerateQueueEndpoint(queueName),
NotifyStrategy.BACKOFF_RETRY,
NotifyContentFormat.SIMPLIFIED // 明确指定为简单格式
));
请检查代码中是否正确传递了该参数。
根据知识库文档,当订阅类型为队列(Queue)时,消息格式可能会受到队列本身的限制。具体来说: - 队列接收端默认会将消息封装为XML格式,即使订阅时指定了SIMPLIFIED
格式。 - 这是因为队列接收端需要额外的元数据(如MessageId
、PublishTime
等)来管理消息生命周期。
因此,即使订阅时设置了SIMPLIFIED
,队列接收端仍可能返回XML格式的消息。这是MNS服务的设计行为。
解决方法: 如果需要提取消息正文,可以通过解析XML获取<Message>
节点的内容。例如:
XmlDocument doc = new XmlDocument();
doc.LoadXml(resp.Message.Body); // 假设resp.Message.Body是XML格式
XmlElement element = doc.DocumentElement;
XmlNodeList nodeList = element.GetElementsByTagName("Message");
if (nodeList.Count == 1)
{
string message = nodeList[0].InnerText; // 提取消息正文
Console.WriteLine("Extracted message: " + message);
}
为了进一步排查问题,请按照以下步骤验证消息发布与接收流程:
确认订阅已成功创建:
NotifyContentFormat
设置为SIMPLIFIED
。检查消息发布内容:
topic.PublishMessage("this is the message 05-811888");
检查队列接收逻辑:
如果队列接收端的XML格式不符合需求,可以考虑使用其他订阅类型(如HTTP)。根据知识库文档,HTTP订阅支持直接接收SIMPLIFIED
格式的消息,而无需额外解析。
示例配置如下: - 订阅类型:选择HTTP
。 - 接收端地址:指定HTTP回调地址。 - 消息格式:选择SIMPLIFIED
。
SIMPLIFIED
格式。SIMPLIFIED
格式的消息。NotifyContentFormat.SIMPLIFIED
。希望以上解答能够帮助您解决问题!如有其他疑问,请随时提问。