Botframework 尝试更新或删除MS团队中的bot活动时收到禁止的错误

Botframework 尝试更新或删除MS团队中的bot活动时收到禁止的错误,botframework,microsoft-teams,Botframework,Microsoft Teams,我为MS团队中的个人对话编写.NETCore3.1bot。我使用瀑布对话框,它生成自适应卡片,我需要在提交后更新或删除这些卡片。但每当我尝试调用UpdateActivityAsync或DeleteActivityAsync方法时,都会出现错误: 操作返回了无效的状态代码“禁止”。 {“error”:{“code”:“botnotinconversationfloster”,“message”:“bot不是会话花名册的一部分。”} 但该错误与自适应卡无关。我尝试了此代码,但仍然有相同的错误: va

我为MS团队中的个人对话编写.NETCore3.1bot。我使用瀑布对话框,它生成自适应卡片,我需要在提交后更新或删除这些卡片。但每当我尝试调用UpdateActivityAsync或DeleteActivityAsync方法时,都会出现错误:

操作返回了无效的状态代码“禁止”。 {“error”:{“code”:“botnotinconversationfloster”,“message”:“bot不是会话花名册的一部分。”}

但该错误与自适应卡无关。我尝试了此代码,但仍然有相同的错误:

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 member = await TeamsInfo.GetMemberAsync(stepContext.Context, 
stepContext.Context.Activity.From.Id, cancellationToken);
这是成功的


可能有什么问题?

我的错误在于获取了必须更新或删除的活动id。只能从响应中找到正确的活动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();
              }  
private async Task ProcessResultsAsync(waterwallstepcontext-stepContext,CancellationToken-CancellationToken)
{
动态选择=stepContext.Result;
var activity_id=stepContext.Context.activity.ReplyToId;
Wait stepContext.Context.DeleteActivityAsync(活动id,cancellationToken);
return wait stepContext.ContinueDialogAsync();
}  

您能试试示例代码吗?我试过你的代码,当我使用turncontext而不是stepcontext时,它能工作吗?你能在没有瀑布对话框的情况下尝试一下吗?@Gousia MSFT谢谢,我已经看过了代码,然后尝试从示例中安装团队对话机器人。我又犯了同样的错误。然后经过一些实验,我发现正确的活动id只能从响应中找到。这也适用于对话。太好了!谢谢你让我们知道。@Gousia MSFT我已经更正了我的答案。请看。我从未见过如何从机器人程序对话框中更新或删除团队活动的示例。如果你能找到正确的方法,我将不胜感激。谢谢。谢谢@nick66,这是获得活动id的唯一方法吗?
 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();
              }