blog.botframework.com/2017/07/18/saving-state-azure-extensions

логе внутри моего бота я сохраняю значение флага в ConversationData следующим образом:

context.ConversationData.SetValue("SomeFlag", true);

Позже мне нужно проверить этот флаг в моем MessagesController,до сообщение отправляется в диалог. Согласноэтот предыдущий вопрос Я попытался получить ConversationData через StateClient следующим образом:

public async Task<HttpResponseMessage> Post([FromBody] Activity incomingMessage)
{
    StateClient stateClient = incomingMessage.GetStateClient();
    BotData userData = await stateClient.BotState.GetConversationDataAsync(message.ChannelId, message.Conversation.Id);
    bool finishedQuote = userData.GetProperty<bool>("SomeFlag");
    //...
    // do conditional logic, then dispatch to a dialog as normal
}

Однако во время выполненияuserData переменная содержит объект BotData, гдеuserData.Data имеет значение null, и я не могу получить сохраненные флаги черезGetProperty, Я не вижу ничего всоответствующая документация это помогает пролить свет на эту проблему - что я могу здесь делать не так? Есть ли что-то, что я неправильно понимаю?

Ответы на вопрос(2)

как показано ниже. Попробуйте код ниже

   public static T GetStateData<T>(Activity activity, string key)
    {
        BotState botState = new BotState(activity.GetStateClient());
        BotData botData = botState.GetConversationData(activity.ChannelId, activity.Conversation.Id);
        return botData.GetProperty<T>(key);
    }
 Sam Hanley08 сент. 2017 г., 17:39
Я не использую веб-чат, я использую эмулятор Bot Framework - и я не думаю, что загрузка UserData или PrivateConversationData будет отличаться, так как они загружаются одинаково. Я ценю попытку, но принятое решение от JasonSowers выше работает отлично.
 Eric Dahlvang29 нояб. 2017 г., 02:29
activity.GetStateClient () устарела. Он получит клиент состояния по умолчанию, предназначенный только для прототипирования:blog.botframework.com/2017/07/18/saving-state-azure-extensions
 Sam Hanley08 сент. 2017 г., 00:58
Это не сработало - это приводит к тому же результату, что и фрагмент, размещенный в моем вопросе.
 Satheesh08 сент. 2017 г., 07:16
чтобы проверить это, попробуйте ввести кодировку «activity.ChannelId» в «webchat» и указать фиксированное значение для разговора при сохранении и получении. Любая конкретная причина для сохранения в ConversationData? Вы также можете попробовать UserData, PrivateConversationData и т. Д.
Решение Вопроса

if (activity.Type == ActivityTypes.Message)
{

    var message = activity as IMessageActivity;
    using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
    {
        var botDataStore = scope.Resolve<IBotDataStore<BotData>>();
        var key = Address.FromActivity(message);

        ConversationReference r = new ConversationReference();
        var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

        //you can get/set UserData, ConversationData, or PrivateConversationData like below
        //set state data
        userData.SetProperty("key 1", "value1");
        userData.SetProperty("key 2", "value2");
        //get state data
        userData.GetProperty<string>("key 1");
        userData.GetProperty<string>("key 2");

        await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);
        await botDataStore.FlushAsync(key, CancellationToken.None);
    }
    await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
}
 Sam Hanley07 сент. 2017 г., 05:37
Спасибо, это было прекрасно! Просто изменил его, чтобы загрузить ConversationData, а не UserData, и он сделал именно то, что мне нужно!
 D4RKCIDE07 сент. 2017 г., 12:46
рад, что у вас это работает

Ваш ответ на вопрос