尝试在 MS Teams 中更新或删除 bot activity 时收到禁止错误

Receive Forbidden error when try to update or delete bot activity in MS Teams

我为 MS Teams 中的个人对话编写 .NET Core 3.1 机器人。我使用瀑布对话框,它会生成自适应卡片,我需要在提交后更新或删除这些卡片。但是每当我尝试调用 UpdateActivityAsync 或 DeleteActivityAsync 方法时,我都会遇到错误:

操作返回无效状态代码 'Forbidden'。 {"error":{"code":"BotNotInConversationRoster","message":"The bot is not part of the conversation roster."}}

但错误与适配卡无关。我试过这段代码,但仍然有同样的错误:

var oldActivity = MessageFactory.Text("Old activity");
var activity_id = stepContext.Context.Activity.Id;
await stepContext.Context.SendActivityAsync(oldActivity);
var newActivity = MessageFactory.Text("New activity");
newActivity.Id = activity_id;
await stepContext.Context.UpdateActivityAsync(newActivity); //error!

var oldActivity = MessageFactory.Text("Old activity");
var activity_id = stepContext.Context.Activity.Id;
await stepContext.Context.SendActivityAsync(oldActivity);
await stepContext.Context.DeleteActivityAsync(activity_id);// error!

顺便调用一下个人信息:

var member = await TeamsInfo.GetMemberAsync(stepContext.Context, 
stepContext.Context.Activity.From.Id, cancellationToken);

成功。

可能出了什么问题?

我的错误在于采用了必须更新或删除的 activity id。正确的 activity id 只能从响应中找到。所以这是一个工作代码:

var oldActivity = MessageFactory.Text("Old activity");
var response = await turnContext.SendActivityAsync(oldActivity);
var activity_id = response.Id;
var newActivity = MessageFactory.Text("New activity");
newActivity.Id = activity_id;
await turnContext.UpdateActivityAsync(newActivity);

顺便说一下,您可以使用 stepContext.Context 而不是 turnContext:

从对话框中执行相同的操作
var oldActivity = MessageFactory.Text("Old activity");
await stepContext.Context.SendActivityAsync(oldActivity);
var response = await stepContext.Context.SendActivityAsync(oldActivity);
var newActivity = MessageFactory.Text("New activity");
newActivity.Id = response.Id;
await stepContext.Context.UpdateActivityAsync(newActivity);

或用于删除,但方式很奇怪 -

看来这不是对话的正确解决方案。 但是当你使用自适应卡片时一切正常。 我使用带有提示的瀑布对话框弹出自适应卡片,如此处所述。 因此,要从之前的瀑布步骤中删除卡片,您需要此代码:

 private async Task<DialogTurnResult> ProcessResultsAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
              {
                dynamic choice = stepContext.Result;
                var activity_id = stepContext.Context.Activity.ReplyToId;
                await stepContext.Context.DeleteActivityAsync(activity_id, cancellationToken);
                return await stepContext.ContinueDialogAsync();
              }