如何使用bot框架将对象存储在私有对话数据中 - 状态管理

时间:2018-02-01 20:23:07

标签: c# bots botframework

我正在尝试在对话框中存储一些数据,以便可以在多个对话框中使用该值来验证和控制流。我有Root Dialog,它将消息转发给Luis Dialog - 我在context.PrivateConversation 中设置了值,只要存储的数据是string或int 类型,它就可以工作。但是,我想存储一个对象 - 当我尝试这样做时 - 在get期间,我总是得到对象属性的默认值,而不是最初设置的值。对象实例的类是同一项目中不同命名空间下的Serializable类。

Luis Dialog - 设置数据 - 当我在此处设置数据时,对象响应具有大多数属性的值。

public async Task Help(IDialogContext context, LuisResult result)
{
 IList<EntityRecommendation> entities = Utility.GetSorttedEntity(result.Entities);
            HelpContext response = getresponse(entities[0].Type, entities);
            string message = response.Responsemessage;
            HelpContext cx = null;
            if (!context.PrivateConversationData.TryGetValue<HelpContext>("HC", out cx))
            {
                context.PrivateConversationData.SetValue<HelpContext>("HC", response);
            }
            await this.ShowLuisResult(context, message);
        }

根对话 - 获取数据 这里helpcontext的所有属性都为null,错误为iserror。

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
    HelpContext helpContext = null;
    if (!context.PrivateConversationData.TryGetValue<HelpContext>("HC", out helpContext))
    {
        var activity = await result as Activity;
        await context.Forward(new BasicLuisDialog(), ResumeAfterLuisDialog, activity, CancellationToken.None);
    }
    context.Wait(this.MessageReceivedAsync);
}

HelpContext类

[Serializable]
    public class HelpContext
    {
        internal string Product { get; set; }
        internal string Errorcode { get; set; }
        internal string Action { get; set; }
        internal bool Iserror { get; set; }
        internal string Responsemessage { get; set; }
    }

所以 - 我不确定我在这里做错了什么。或者是 - 我不能使用对象存储私人会话数据?

谢谢!

1 个答案:

答案 0 :(得分:3)

在使用字符串值进行初步实验后,我开始使用词典进行测试 - 这也是有效的,我期待它失败。这让我措手不及,也让我意识到还有其他基本的东西我和#39;我失踪了。我再次回到HelpContext类来查看我可能错过的内容 - 显然问题在于访问修饰符 - 当我从&#34;内部&#34;更改了HelpContext属性时。对于&#34; public&#34;,一切都按照我期望的方式开始工作。由于在调试期间可以访问这些值,因此没有及早发现它。

旧代码:

[Serializable]
    public class HelpContext
    {
        internal string Product { get; set; }
        internal string Errorcode { get; set; }
        internal string Action { get; set; }
        internal bool Iserror { get; set; }
        internal string Responsemessage { get; set; }
    }

新守则:

[Serializable]
    public class HelpContext
    {
        public string Product { get; set; }
        public string Errorcode { get; set; }
        public string Action { get; set; }
        public bool Iserror { get; set; }
        public string Responsemessage { get; set; }
    }