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

Alo*_*ran 3 c# botframework

我一直在使用context.setvalue(); 和context.TryGetvalue(); 在Bot Framework中存储和接收数据到不同的存储.

我想知道如何从MessageController.cs访问这些值

已经尝试过创建一个New对象,它对我不起作用.

D4R*_*IDE 7

我在寻找我发布的另一个答案时找到了这篇文章。我希望以后来这里的任何人都知道正确的方法。

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());
}
Run Code Online (Sandbox Code Playgroud)


小智 5

要获取对话数据,您需要引用上下文或从活动中获取状态客户端.

在Dialog中你可以使用上下文:http: //robinosborne.co.uk/2016/08/08/persisting-data-within-a-conversation-with-botframeworks-dialogs/

在Dialog之外,您可以使用该活动获取状态客户端:

StateClient stateClient = activity.GetStateClient();
BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
if (userData.GetProperty<bool>("SentGreeting"))
        // do something
Run Code Online (Sandbox Code Playgroud)

https://docs.botframework.com/en-us/csharp/builder/sdkreference/stateapi.html

希望有所帮助!