Настройка
У меня есть бот, который работает на .NET + Bot Framework + Azure + Facebook Messenger.
Исходная проблема
Я пытался решить проблему, когда отправка нескольких сообщений боту вызывает исключение и ошибку HTTP 412. Microsoft описывает эту проблему здесь: https://docs.microsoft.com/en-us/bot-framework/troubleshoot-general-problems#what-causes-an-error-with-http-status-code-412-precondition-failed-or-http-status-code-409-conflict
Первое решение
На странице выше Microsoft предоставляет устаревший пример кода для решения этой проблемы. В этой проблеме github есть исправленная версия этого кода, которая должна работать. . Я поместил его в конструктор моего MessageController:
static MessagesController()
{
// Prevent exception in the bot and HTTP error 412 when the user
// sends multiple messages in quick succession. This may cause
// potential problems with consistency of getting/setting user
// properties.
// See https://docs.microsoft.com/en-us/bot-framework/troubleshoot-general-problems#what-causes-an-error-with-http-status-code-412-precondition-failed-or-http-status-code-409-conflict
// for details. The above link contains wrong code sample, revised
// code is from here: https://github.com/Microsoft/BotBuilder/issues/2345
var builder = new ContainerBuilder();
builder
.Register(c => new CachingBotDataStore(c.ResolveKeyed<IBotDataStore<BotData>>(typeof(ConnectorStore)), CachingBotDataStoreConsistencyPolicy.LastWriteWins))
.As<IBotDataStore<BotData>>()
.AsSelf()
.InstancePerLifetimeScope();
builder.Update(Conversation.Container);
}
Вторая проблема
Теперь исключение по-прежнему возникает, когда я быстро отправляю несколько сообщений боту. Однако он изменился с ошибки HTTP 412 на что-то другое:
Произошла одна или несколько ошибок. в System.Threading.Tasks.Task.ThrowIfExceptional (логическое значение includeTaskCanceledExceptions) в System.Threading.Tasks.Task1.GetResultCore (логическое значение waitCompletionNotification) в System.Threading.Tasks.Task1.get_Result() в MyBot.SetUserDataProperty (активность действия, String PropertyName) , строка ValueToSet) в C:\Users\xxx.cs:строка 230
Обновление: я проверил InnerException
вышеизложенного, и оказалось, что это та же самая старая ошибка HTTP 412:
Удаленный сервер возвратил ошибку: (412) Precondition Failed.
Нарушающий код — это функция, которая записывает данные в хранилище бота. Строка 230, упомянутая выше, является последней строкой этой функции:
public static void SetUserDataProperty(Activity activity, string PropertyName, string ValueToSet)
{
StateClient client = activity.GetStateClient();
BotData userData = client.BotState.GetUserData(activity.ChannelId, activity.From.Id);
userData.SetProperty<string>(PropertyName, ValueToSet);
//client.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);
// Await async call without making the function asynchronous:
var temp = Task.Run(() => client.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData)).Result;
}
Вопрос
Что еще я могу сделать, чтобы убедиться, что пользователь может отправлять несколько сообщений в быстрой последовательности, не вызывая исключения при записи в хранилище BotState?
context.UserData.SetValue<string>(PropertyName, ValueToSet);
- person   schedule 05.09.2017SetUserDataProperty
в диалоге? - person D4RKCIDE   schedule 05.09.2017