【问题标题】:BotFramework conversation not found未找到 BotFramework 对话
【发布时间】:2021-05-27 23:33:40
【问题描述】:

我一直在尝试测试一个函数应用程序,它将一个活动发送到一个有现有对话的机器人,但为了简化这篇文章,我将通过邮递员发送它。尽管事先确认它确实存在并且我不完全确定我做错了什么,但我一直在反对没有找到 conversationId 的问题。

我登录到 azure 门户网站,然后转到我的机器人在网络聊天中进行测试。我对机器人进行身份验证,对话开始。

在这里,我通过检查 Chrome 调试工具中的对话调用响应,检查了 conversationId 是否正是我所期望的,在本例中为 1GJ0N9UYKGyELu3LqpDF6b-a

这是确切的对话响应...

conversationId: "1GJ0N9UYKGyELu3LqpDF6b-a"
expires_in: 3600
referenceGrammarId: "fcab5fbf-67c7-bf55-934a-274e525c78a9"
streamUrl: "wss://webchat.botframework.com/v3/directline/conversations/1GJ0N9UYKGyELu3LqpDF6b-a/stream?watermark=-&t=ew0KICAi...."
token: "ew0KICA..."

所以从这里开始,在我看来我应该能够在邮递员中执行以下操作

POST https://webchat.botframework.com/v3/directline/conversations/1GJ0N9UYKGyELu3LqpDF6b-a/activities
Content-Type: application/json
Authorization: Bearer {My webchats channels secret code}
Body:
{
  "type": "message",
  "from": {
    "name": "foo"
  },
  "text": "bar"
}

我希望 200OK 和消息 'bar' 会出现在来自 'foo' 的我的网络聊天测试中,但事实并非如此。相反,我在邮递员中收到错误说明:

{
    "error": {
        "code": "BadArgument",
        "message": "Conversation not found"
    }
}

这到底是怎么回事?如果我刚刚创建了该对话并且可以证明正在使用对话 ID,那么为什么帖子消息说找不到它?我是否错误地使用了频道?或者在这里做一些非常明显的事情?

【问题讨论】:

  • 一般来说,上述方法没有理由不奏效。我测试了您的相同设置,它对我来说效果很好。唯一需要注意的是,您需要包含 activity.from.id 的值。否则,Direct Line 会投诉。但是,这会产生不同的反应。唯一可能导致这种情况的是不正确的conversationId。很高兴它工作正常。

标签: azure botframework direct-line-botframework


【解决方案1】:

所以回答我自己的问题,长话短说。看起来微软文档中提供的示例活动并没有完全削减它。还有一些东西是必需的,虽然我没有时间缩小范围。

由于时间不够用,我采取的解决方案是编写一个方法来将活动保存到 cosmosDb 作为身份验证流程的一部分。这样我就有了一个铁定的活动,我知道它至少在对话的调用阶段起作用,并且我知道对话引用是正确的并且存在。从那里我提取了活动并更改了其中的 4 个字段。

activity.Type = "message",
activity.From = new From { Id = "{BotId}", Name = "Gilbert Bottfried", Role = "bot },
activity.Text = "{My message}",
activity.Subject = "{my message subject}"

从那里开始,基本上就是创建一个连接器客户端并启动这个重新调整用途的活动。

AppCredentials.TrustServiceUrl(serviceUrl, DateTime.MaxValue);
ConnectorClient client = new ConnectorClient(
    new Uri(serviceUrl),
    MicrosoftAppId,
    MicrosoftAppPassword);

await client.Conversations.SendToConversationAsync(activity.Conversation.Id, activity);

似乎这足以让它工作,并且它为将来的消息提供了一个很好的可参考对话 ID。虽然我发现了使用 WebChat 的其他问题,因为我怀疑通过 websockets 发送消息和抛出消息并不完全稳定。 msteams 本身的测试体验要稳定得多,它似乎可以像处理冠军一样处理我的测试消息。

这本质上是一种蛮力方法,因为我正在存储和发送大量不必要的数据,但它确实有效。我可能会附加此答案以减少我认为将来需要的内容,但这需要进行测试。

【讨论】:

  • 据我所知,您似乎正在尝试发送proactive message。您似乎缺少的是填充在机器人控制器部分的对话参考。当然,您需要调整文档以满足您的需求,但上述内容应该会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多