WedX - журнал о программировании и компьютерных науках

Ошибка 412 — Управление данными о состоянии бота

Я следил за документацией Bot Framework для хранения Bot-Data, но даже после использования предоставленного фрагмента кода здесь для обработки параллелизма. Я все еще получаю ошибку 412 в эмуляторе. Подскажите, пожалуйста, правильно ли я сохраняю и получаю состояние бота.

Я пытался установить точки останова при сохранении состояния бота, но он не попадает ни в один из блоков catch.

Скриншот эмуляторавведите здесь описание изображения

namespace HealthBot
{
    [Serializable]
    [LuisModel("id", "password")]
    public class RootDialog : LuisDialog<object>
    {
        private const string EntityDateTime = "builtin.datetimeV2.date";
        protected override async Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> item)
        {
            var message = await item;
            if (message.Text == null)
            {
                await Help(context, item, null);
            } 
            else
            {
                await base.MessageReceived(context, item);
            }
        }


        [LuisIntent("Claims")]
        private async Task Claims(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result)
        {
            StateClient stateClient = context.Activity.GetStateClient();
            BotData userData = stateClient.BotState.GetPrivateConversationData(context.Activity.ChannelId, context.Activity.Conversation.Id ,context.Activity.From.Id);
            bool isVerified = userData.GetProperty<bool>("isVerified");

            if (isVerified)
            {
                string message = "Yes, but please tell me your claim ID";
                var response = context.MakeMessage();
                response.Text = message;
                response.Speak = message;
                response.InputHint = InputHints.ExpectingInput;
                await context.PostAsync(response);
                context.Wait(MessageReceived);
            }
            else
            {
                await StartVerification(context, activity);
            }
        }

        private async Task StartVerification(IDialogContext context, IAwaitable<IMessageActivity> activity)
        {
            string message = "What is your customer ID";
            var response = context.MakeMessage();
            response.Text = message;
            response.Speak = message;
            response.InputHint = InputHints.ExpectingInput;

            await context.PostAsync(response);
            context.Wait(VerifyCustomerId);
        } 

        private async Task VerifyCustomerId(IDialogContext context, IAwaitable<IMessageActivity> activity)
        {
            var message = await activity;
            string customerID = message.Text.Replace(" ", "");
            string responseMessage = $"You provided, {customerID}";

            try
            {
                StateClient stateClient = context.Activity.GetStateClient();
                BotData userData = await stateClient.BotState.GetPrivateConversationDataAsync(context.Activity.ChannelId, context.Activity.Conversation.Id, context.Activity.From.Id, CancellationToken.None);
                userData.SetProperty<bool>("isVerified", true);
                await stateClient.BotState.SetPrivateConversationDataAsync(context.Activity.ChannelId, context.Activity.Conversation.Id, context.Activity.From.Id, userData);
            }
            catch (HttpOperationException err)
            {
                responseMessage = "Oops! something went wrong";
            }
            catch (Exception ex)
            {
                responseMessage = ex.Message;
            }
            finally
            {
                await context.PostAsync(CreateMessageWith(context, responseMessage));
                context.Wait(MessageReceived);
            }
        }

        private IMessageActivity CreateMessageWith(IDialogContext context, string response)
        {
            var reply = context.MakeMessage();
            reply.Text = response;
            reply.Speak = response;
            reply.InputHint = InputHints.ExpectingInput;
            return reply;
        }
    }
}
27.07.2017

  • Что произойдет, если вместо использования Stateclient вы используете context.PrivateConversationData? 27.07.2017
  • Я не пробовал, но есть ли причина, по которой документация не работает так, как рекламируется. Но я обязательно дам вам знать, как только попробую. 27.07.2017
  • Он работает, и я нашел ваш проект на Github. Не могли бы вы рассказать мне, как справиться с тайм-аутом во время вызовов сторонних сервисов, потому что я не нашел ни одной статьи об этом в документации BotFramework. 28.07.2017
  • Пожалуйста, добавьте еще один вопрос о тайм-ауте. Я добавил ответ на этот вопрос. Пожалуйста, примите/проголосуйте 28.07.2017

Ответы:


1

В контексте диалога я бы попробовал использовать context.PrivateConversationData вместо StateClient.

Вы можете проверить образец C# State, чтобы полностью понять как это работает.

28.07.2017
  • @user6083088 user6083088 Внутри диалога состояние автоматически сохраняется. Если вы используете клиент состояния активности внутри диалога, когда состояние диалога автоматически сохраняется, возникает конфликт. 04.08.2017
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]