首页 > 解决方案 > 使用 await context.PostAsync(reply) 发送多条消息时,有时会乱序接收

问题描述

当我们使用 Directline 通道使用以下代码发送消息时,有时会收到消息并交换它们的顺序。

await context.PostAsync(msg1);
await context.PostAsync(msg2);

预期的:

mgs1
味精2

但在某些情况下,它们会通过

消息 2 消息
1

有没有办法处理和防止这种情况?

标签: botframework

解决方案


假设您使用 Directline 或 REST API 接收消息,我将编写此答案。如果不是这样,我可以更新。

整个答案基于来自机器人文档的接收活动以及对 Directline API 进行一些测试以确认。

如果您是通过 WebSocket 连接的,那么您应该始终按顺序接收消息,前提是消息中没有某种需要额外处理的大小差异(例如有附件)。

如果不是,则通过轮询间隔检索消息,这意味着您的客户端可能每 5 或 10 秒(因客户端而异)发送一个 GET 请求以检索所有尚未检索的消息。

这样做后,客户端将收到如下信息:

{
    "activities": [
        {
            "type": "message",
            "channelId": "directline",
            "conversation": {
                "id": "abc123"
            },
            "id": "abc123|0000",
            "from": {
                "id": "user1"
            },
            "text": "hello"
        }, 
        {
            "type": "message",
            "channelId": "directline",
            "conversation": {
                "id": "abc123"
            },
            "id": "abc123|0001",
            "from": {
                "id": "bot1"
            },
            "text": "Nice to see you, user1!"
        }
    ],
    "watermark": "0001a-95"
}

我的猜测是您的客户只是foreach在一系列活动上运行,这可能会乱序显示它们。如果您让客户通过timestamp或订购它们id,它应该可以工作。


推荐阅读