未找到 BotFramework 对话

问题描述

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

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

在这里,我通过检查 Chromes 调试工具中的对话调用响应来检查 sessionId 正是我所期望的,在这种情况下它是 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"
    }
}

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

解决方法

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

由于时间紧迫,我采用的解决方案是编写一种方法,将活动保存到 cosmosDb 作为身份验证流程的一部分。通过这种方式,我有一个铁定的活动,我知道它至少在对话的调用阶段起作用,并且我知道对话参考是正确和存在的。从那里我提取了 Activity 并更改了其中的 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 本身的测试体验要稳定得多,它似乎像冠军一样处理我的大量测试消息。

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