【问题标题】:Creating Teams Channel conversation failing with ConversationNotFound error code创建团队频道对话失败并出现 ConversationNotFound 错误代码
【发布时间】:2020-01-07 18:25:19
【问题描述】:

我有一个 Bot Framework V3 机器人代码库,该代码库在六个左右不同的客户 Teams 租户中运行,并且在我们的内部 Teams 租户中运行没有问题。

在一个特定的客户租户中,当我调用 ConnectorClient.Conversations.CreateConversationAsync() 时,尝试向团队频道创建主动消息失败并出现 ConversationNotFound 404 错误。

我创建对话并在频道中发布活动的代码如下所示:

    var teamsChannelId = "19:deadbeef1234@thread.skype"; // insert the real channel ID obtained from lookups against Graph API...
    var botCredentials = new MicrosoftAppCredentials(/* Bot ID & password */);

    MicrosoftAppCredentials.TrustServiceUrl("https://smba.trafficmanager.net/amer/", DateTime.MaxValue);
    using (var connectorClient = new ConnectorClient(new Uri("https://smba.trafficmanager.net/amer/"), botCredentials)) {
        var botId = new ChannelAccount("28:" + botCredentials.MicrosoftAppId);
        var msg = Activity.CreateMessageActivity();
        msg.From = botId;
        var card = MakeCard(); // builds an AdaptiveCard...
        msg.Attachments.Add(new Attachment(AdaptiveCard.ContentType, content: card));

        var parameters = new ConversationParameters() {
            Bot = botId,
            ChannelData = new TeamsChannelData() {
                Channel = new ChannelInfo(teamsChannelId)
            },
            Activity = (Activity)msg
        };
        // This throws an Microsoft.Bot.Connector.ErrorResponseException with the code "ConversationNotFound"
        ConversationResourceResponse convoResponse = await connectorClient .Conversations.CreateConversationAsync(parameters);
    }

正如我最初提到的,这段代码可能并不完美,但它可以在许多不同的 Teams 和 Azure 环境中运行,但在这个特定环境中失败了。来自 Bot Framework 的 HTTP 响应如下所示:

"Response": {
"StatusCode": 404,
"ReasonPhrase": "Not Found",
"Content": "{\"error\":{\"code\":\"ConversationNotFound\",\"message\":\"Conversation not found.\"}}",
"Headers": {
  "Date": [
    "Wed, 04 Sep 2019 14:43:24 GMT"
  ],
  "Server": [
    "Microsoft-HTTPAPI/2.0"
  ],
  "Content-Length": [
    "77"
  ],
  "Content-Type": [
    "application/json; charset=utf-8"
  ]
}

堆栈跟踪:

Microsoft.Bot.Connector.ErrorResponseException: Operation returned an invalid status code 'NotFound'
   at Microsoft.Bot.Connector.Conversations.<CreateConversationWithHttpMessagesAsync>d__6.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Bot.Connector.ConversationsExtensions.<CreateConversationAsync>d__3.MoveNext()
  • 机器人能够处理传入的 1-1 聊天对话,而不会出现通过网络聊天、直线和团队连接器的问题,因此我认为机器人凭据或机器人注册配置没有任何问题。
  • 该机器人已作为 Microsoft Teams 的应用添加、上传到租户并添加到相应的团队。
  • 我已经探索了 Azure 中 Bot Framework 注册区域可能会导致问题的可能性,但我已经在我们端重现了客户端的配置,但无法重现问题。

非常欢迎任何建议。

【问题讨论】:

  • 请不要硬编码serviceURL值。当用户向您的机器人发送消息时,传入请求包含一个带有 serviceUrl 属性的 Activity 对象,该属性指定您的机器人应向其发送响应的端点。请使用特定租户的服务 URL,然后重试。
  • 我没有有效的传入响应 - 这是一条主动消息,它通过与来自用户的任何传入请求不同的渠道发送。是否有一个列表记录了可用的服务 URL 是什么以及它们应该对应什么?这是令人沮丧的,因为所有的地狱都试图在 Bot Framework 的快乐路径之外做任何适度的事情,因为记录的太少,而被混淆的太多。
  • 你能用我的回答来解决这个问题吗?如果是这样,请“接受”并投票,以便其他人可以快速找到答案,我可以从我的支持跟踪器中清除它。如果没有,请告诉我我还能提供哪些帮助!

标签: botframework microsoft-teams


【解决方案1】:

我感觉您的parameters 缺少Tenant。这可以解释为什么它在某些租户而不是其他租户上失败。试试这样的:

var parameters = new ConversationParameters
{
    Members = new[] { new ChannelAccount(userId) },
    ChannelData = new TeamsChannelData
    {
        Tenant = new TenantInfo(activity.Conversation.TenantId),
    },
};

@Trinetra-MSFT 也是正确的。您不应该对服务 URL 进行硬编码;您的某些用户可能不在/amer

尽管在某种程度上可能,“主动消息传递”不应被视为“向未与机器人交谈过的用户发送消息”,就像 "messaging a user about something not related to a previous conversation" 一样。一般来说,主动消息需要由saving a conversation reference 来自与机器人进行过对话的用户完成。这就是 Bot 框架具体定义主动消息传递的方式。

对于团队,每个Proactive Messaging for Bots

机器人可以与单个 Microsoft Teams 用户创建新对话只要您的机器人具有通过以前添加到个人、群聊或团队范围中获得的用户信息。此信息使您的机器人能够主动通知他们。例如,如果您的机器人被添加到团队中,它可以查询团队名册并在个人聊天中向用户发送个人消息,或者用户可以@提及另一个用户以触发机器人向该用户发送直接消息。

this SO answer for additional help注意:它是为 V4 机器人编写的,因此您可能需要进行一些调整。

如果您遇到问题,请告诉我,我会相应地调整答案。

【讨论】:

  • 我通过使服务 URL 可配置解决了这个问题。仍然需要一些试验和错误才能找到合适的值 - 我认为可能的值不会在任何地方发布,但如果您记录事件并让 Teams 用户在机器人上发起聊天,您可以找出什么是需要。我想如果这些 API 不在 Beta 版中,可以将 Graph API 用于消息传递场景,但是需要将 Bot Framework 用于传入聊天会话和另一个 API 用于传出聊天的混合是很奇怪的。使用 Lync/S4B 支持简单的场景仍然有点笨拙。
  • 很高兴你能成功!请注意,S4B 即将被弃用。
  • 据我所知,内部部署的 Skype for Business 仍将存在一段时间,不再是这种情况了吗?
  • @EricRRichards 直到July 31, 2021
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2013-10-25
  • 2019-10-04
相关资源
最近更新 更多