Microsoft Bot Framework v4: превентивное сообщение в мессенджере Facebook неавторизовано после перезапуска бота

Я написал бота, используя SDK microsoft framework v4 на C #. Бот развернут в Azure и подключен к веб-чату, прямой линии и каналам Facebook Messenger. Бот у всех работает нормально.

Пользователи могут подписаться на получение обновлений заранее. Для этого я использую сохраненную ConversationReference, которая затем используется для отправки упреждающих сообщений. Опять же, все работает нормально, за исключением того случая, когда бот wepApp перезапускается, что вызывает: -

Exception caught : Microsoft.Bot.Schema.ErrorResponseException: Operation returned an invalid status code 'Unauthorized' for the facebook channel.

Если я отправлю другое сообщение боту из мессенджера facebook, то упреждающие сообщения снова начнут работать даже для старых сохраненных ConversationReferences.

Первоначально я использовал MemoryStorage в соответствии с примерами, но я изменил его, чтобы использовать хранилище BLOB-объектов Azure для диалогаState и userState. Это не имеет значения. Это как если бы он должен хранить токен аутентификации facebook в памяти, поэтому, если приложение перезапускает токен, токен теряется до тех пор, пока пользователь не отправит другое сообщение из мессенджера.

Есть ли способ исправить это, поскольку он делает бессмысленными подписанные проактивные обновления, если он не может справиться с перезапуском веб-приложения бота?

Большое спасибо


person hitcai    schedule 18.02.2019    source источник


Ответы (1)


Это очень похоже на Проблема с URL-адресом службы доверия.

Вы можете исправить это, добавив facebook в список доверенных URL:

var serviceUrl = "https://facebook.botframework.com/";

var connector = new ConnectorClient(new Uri(serviceUrl), new MicrosoftAppCredentials("YourAPPID", "YourAppPassword"));

MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);

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

Примечание для других:

Эта «Проблема с URL-адресом службы доверия» относится не только к Facebook. Это происходит со многими другими URL-адресами при попытке использовать превентивный обмен сообщениями. Просто замените serviceUrl на то, что подходит для вашего варианта использования. И да, если вы используете несколько каналов, вы можете добавить несколько URL-адресов при использовании MicrosoftAppCredentials.TrustServiceUrl(), вызвав его несколько раз.

Вот определение метода. Примечание: для этого также можно добавить срок действия.

В соответствии с запросом, я отправил PR для этого

person mdrichardson    schedule 19.02.2019
comment
Именно так. Задача решена. Большое спасибо! Вероятно, его следует добавить или упомянуть в примерах проактивных ботов. - person hitcai; 19.02.2019
comment
@hitcai Добро пожаловать! Вы правы, образцы должны упоминать это, поэтому я отправил на это PR (см. Обновление выше). - person mdrichardson; 22.02.2019