未找到BotFramework对话



我一直在尝试测试一个功能应用程序发送一个活动到一个机器人,有一个现有的对话,但为了简化这篇文章,我说的是通过邮差发送。我遇到了一个问题,其中conversationId没有被找到,尽管我事先确认它确实存在,我不完全确定我做错了什么。

我登录到门户azure,并去我的机器人测试在网络聊天。我验证了机器人,对话开始了。

在这里,我已经检查了conversationId正是我通过检查chrome调试工具中的会话调用响应所期望的,在这种情况下,它是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..."

那么从这里开始,在我的脑海中,我应该能够在postman

中执行以下操作
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和消息'栏'出现在我的测试在Web聊天从'foo',但它没有。相反,我在postman中得到一个错误声明:

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

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

那么回答我自己的问题,长话短说。看起来微软文档中提供的示例活动并没有完全解决问题。还有其他需要的东西,尽管我没有时间缩小范围。

由于时间不够用,我采用的解决方案是编写一个方法将活动保存到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抛出。在msteam上的测试体验要稳定得多,它似乎像冠军一样处理了我一连串的测试信息。

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

最新更新