从消息控制器c#访问会话数据
本文关键字:会话 数据 访问 消息 控制器 | 更新日期: 2023-09-27 18:15:36
我一直在使用context.setvalue();和context.TryGetvalue ();将数据存储和接收到Bot框架中的不同存储。
我想知道如何从messageconcontroller .cs中访问这些值
已经尝试创建一个新对象,它不适合我
我在寻找我发布的另一个答案时发现了这个帖子。我希望将来来这里的任何人都知道正确的方法。
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());
}
要获取会话数据,您要么需要对上下文的引用,要么需要从活动获取状态客户端。
在对话框中你可以使用上下文: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 希望有帮助!