我一直在尝试测试一个函数应用程序,它将一个活动发送到一个已有会话的机器人上,但为了简化这篇文章,我将通过邮递员发送它。我一直遇到一个问题,conversationId没有被找到,尽管我事先确认了它确实存在,而且我不完全确定我做错了什么。
我登录到门户网站azure,然后转到我的机器人进行网络聊天测试。我验证了机器人的身份,对话就开始了。
在这里,通过检查Chromes调试工具中的对话调用响应,我已经检查了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..."因此,在我看来,我应该能够在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和消息'bar‘会出现在我的网络聊天测试中,来自'foo',但它没有。相反,我在postman中得到了一个错误,声明:
{
"error": {
"code": "BadArgument",
"message": "Conversation not found"
}
}这到底是怎么回事呢?如果我刚刚创建了该对话,并且可以证明conversationId正在使用中,为什么post消息说找不到它?我是否错误地使用了通道?还是在做一些显而易见的事情?
发布于 2021-03-02 06:20:57
所以回答我自己的问题,长话短说。看起来Microsoft文档中提供的示例活动并没有完全解决这个问题。有
一些东西
否则这是必需的,尽管我没有时间来缩小范围。
我采取的解决方案是编写一个方法,将活动作为身份验证流的一部分保存到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上的测试体验要稳定得多,它似乎可以像冠军一样处理我接二连三的测试消息。
这本质上是一种暴力方法,因为我存储和发送了许多不必要的数据,但它是有效的。我可能会附加这个答案来削减我发现的未来需要的东西,但这将需要测试。
https://stackoverflow.com/questions/66371375
复制相似问题