我一直在使用context.setvalue();和context.TryGetvalue();在Bot Framework中存储和接收数据到不同的存储。
我想知道如何从MessageController.cs
访问这些值我们已经尝试过创建一个新对象,但它不适合我。
答案 0 :(得分:5)
要获取会话数据,您需要引用上下文或从活动中获取状态客户端。
在Dialog中你可以使用上下文: http://robinosborne.co.uk/2016/08/08/persisting-data-within-a-conversation-with-botframeworks-dialogs/
在对话框之外,您可以使用该活动获取州客户端:
StateClient stateClient = activity.GetStateClient();
BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
if (userData.GetProperty<bool>("SentGreeting"))
// do something
https://docs.botframework.com/en-us/csharp/builder/sdkreference/stateapi.html
希望有所帮助!
答案 1 :(得分:5)
我在搜索我发布的另一个答案时发现了这篇文章。我希望将来有人能够知道正确的方法。
StateClient stateClient = activity.GetStateClient();
仅获取默认状态客户端,该客户端自2018年3月31日起不再使用。它已被内存状态存储库取代。如果您已经实现了自己的状态客户端(即cosmosDB,Azure表存储,SQL等),那么在消息控制器中访问状态的正确方法就是这样:
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);
//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());
}