【问题标题】:Accessing Conversation data from Message Controller c#从消息控制器 c# 访问对话数据
【发布时间】:2018-05-11 01:55:29
【问题描述】:

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

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

已经尝试创建一个新对象,它对我不起作用。

【问题讨论】:

    标签: c# botframework


    【解决方案1】:

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

    StateClient stateClient = activity.GetStateClient(); 仅获取 Default 状态客户端,该客户端已于 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());
    }
    

    【讨论】:

    • 我遇到了一个奇怪的System.MissingMethodException: Method not found: 'Autofac.IContainer Microsoft.Bot.Builder.Dialogs.Conversation.get_Container()'. 异常。使用 Microsoft.Bot.Builder 3.15。反编译 DLL (JetBrains dotPeek),令我惊恐的是,Conversation 类不见了!还有人得到这个吗? @AlokRajasukumaran ?
    【解决方案2】:

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

    在对话框中你可以使用上下文: 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

    希望有帮助!

    【讨论】:

    • 所以在你的博客中发布你说的私人 convo 是什么需要使用而不是正常的对话数据?
    • 我已经尝试过这种方法,但是从消息控制器发送数据并没有多大帮助。
    • 问的是messaegcontroller.cs里面
    • 是的,在对话框之外(即在您的 MessagesController 中),您可以使用 stateClient - 我的答案的第二部分:StateClient stateClient = activity.GetStateClient();
    • 好的,我将数据点移动到 idialog。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2013-12-17
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多