Получать запрещенную ошибку при попытке обновить или удалить активность бота в MS Teams - PullRequest
1 голос
/ 05 мая 2020

Пишу. NET Бот Core 3.1 для личного разговора в MS Teams. Я использую диалоги водопада, которые генерируют адаптивные карточки, и мне нужно обновить или удалить эти карточки после отправки. Но всякий раз, когда я пытаюсь вызвать методы UpdateActivityAsyn c или DeleteActivityAsyn c, я получаю ошибку:

Операция вернула недопустимый код состояния «Запрещено». {"error": {"code": "BotNotInConversationRoster", "message": "Бот не входит в список разговоров."}}

Но ошибка не связана с адаптивными картами . Я пробовал этот код, но по-прежнему возникает та же ошибка:

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);

прошел успешно.

Что может быть не так?

1 Ответ

1 голос
/ 06 мая 2020

Моя ошибка заключалась в том, что я взял идентификатор активности, который нужно обновить или удалить. Правильный идентификатор активности можно узнать только из ответа. Итак, вот рабочий код:

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);

или для удаления, но странно способ - enter image description here

Похоже, это неправильное решение для диалогов. Но когда вы используете адаптивные карты, все в порядке. Я использую диалоги водопада с подсказками для всплывающих адаптивных карт, как описано здесь Использование адаптивных карт с диалогами водопада . Итак, чтобы удалить карту из предыдущего шага водопада, вам понадобится этот код:

 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();
              }  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...