从消息控制器c#访问会话数据



我一直在使用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

希望有帮助!

最新更新