尝试在 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();
}
我为 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();
}