Почему поведение BotConnector отличается от поведения эмулятора?

Я играю с недавно выпущенным Microsoft Bot Framework. Я сделал следующие шаги:

  1. Создал простого бота с помощью IDialog (образец Echo Bot), протестированного с помощью эмулятор, развернутый в службе приложений Azure и зарегистрированный на сайте dev.botframework.com. Все работало нормально.

  2. Обновлен бот для работы с Luis с помощью LuisDialog и добавлены атрибуты [LuisModel] и [LuisIntent] (на основе пример бота-будильника) и развернул его в облаке.

После этого у меня странное поведение:

Как локальное, так и облачное развертывание работают должным образом с использованием эмулятора, и часть Luis работает хорошо.

При запуске того же бота из тестового соединения BotConnector он не связывает Luis, а вместо этого входит в MessageReceivedAsync.

Я проверил путь бота, идентификатор приложения и ключи, повторно развернул AppService и повторно зарегистрировал бота, и все равно получаю то же поведение.

Мой ReceiveMessageAsync выглядит следующим образом:

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<Message> result)
{
  var message = await result;

  await context.PostAsync("You have just said: " + message.Text);
  context.Wait(MessageReceivedAsync);
}

Причина, по которой я его не удаляю, заключается в том, что тестовое соединение перестает работать без него. Эмулятор, с другой стороны, работает хорошо.

Разве тестовое соединение в BotConnector и эмулятор, указывающее на одну и ту же конечную точку, не должны ВСЕГДА возвращать одинаковые результаты? Или я что-то упускаю?


person Anton Vidishchev    schedule 01.04.2016    source источник
comment
Упомянутый вами MessageReceivedAsync - это ваш MessageReceivedAsync или LuisDialog.MessageReceivedAsync? Всегда вызывается тот, что в LuisDialog, потому что это то, что отправляет ваши методы Luis. Если это ваш собственный ... вам нужно удалить его, чтобы тот, который находится в LuisDialog, мог обрабатывать и отправлять. Это должно работать одинаково между эмулятором и соединителем, но мы можем работать над этим после того, как узнаем, какой метод вы видите вызванным.   -  person Dan Driscoll    schedule 01.04.2016
comment
Я обновил пост с подробностями. Я не могу удалить этот метод MessageReceivedAsync из примера EchoBot, поскольку он разрывает тестовое соединение. Кроме того, когда я переустанавливаю с небольшим изменением строки (Вы сказали, Вы сказали, Вы только что сказали) - я вижу эти изменения в тестовом соединении, но оно все еще не входит в часть Луиса. И снова конечная точка работает правильно, когда я запускаю ее из эмулятора. Я могу поделиться кодом/приложением/секретами, если это необходимо.   -  person Anton Vidishchev    schedule 03.04.2016
comment
Я думаю, проблема в том, что ваш диалог с Луисом каким-то образом сломан. Добавление вашего собственного MessageReceivedAsync скрывает сбой на вашем компьютере разработчика, но при развертывании это сокрытие не работает (либо потому, что вы развертываете биты выпуска, либо потому, что IIS работает иначе, чем IIS Express, или что-то еще).   -  person Dan Driscoll    schedule 06.04.2016


Ответы (2)


Да, Bot Connector и эмулятор отправляют одинаковые сообщения.

Возвращает ли ваш код одно и то же значение, зависит от того, как вы работаете с сообщением, от среды вызова (вызывается с локального хоста через HTTP, а не удаленно через HTTPS) и от среды размещения (обычно биты отладки в IIS Express и биты выпуска в IIS, для приложений C#).

person Dan Driscoll    schedule 06.04.2016

Больше не применимо. Более новая версия 1.1, в которую, кстати, внесены критические изменения, отлично работает на той же кодовой базе.

person Anton Vidishchev    schedule 18.04.2016