C# Botdata.SetProperty不保存其值

C# Botdata.SetProperty不保存其值,c#,bots,botframework,C#,Bots,Botframework,我使用formflow,我试图设置一个属性,以了解用户是否已经收到问候,它设置数据时没有任何问题(userData.SetProperty(“Greet”,true);), 我通常在设置之后检查属性,但是当您在下一次运行(userData.GetProperty(“Greet”)期间尝试获取属性的值时,它似乎没有保存。我需要这样做,以便在问候用户之后,它将退出表单流并尝试qnadialog MessageController public async Task<HttpResponse

我使用formflow,我试图设置一个属性,以了解用户是否已经收到问候,它设置数据时没有任何问题(userData.SetProperty(“Greet”,true);), 我通常在设置之后检查属性,但是当您在下一次运行(userData.GetProperty(“Greet”)期间尝试获取属性的值时,它似乎没有保存。我需要这样做,以便在问候用户之后,它将退出表单流并尝试qnadialog

MessageController

  public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.Type == ActivityTypes.Message)
        {
            //ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
            //await Conversation.SendAsync(activity, () => new QnADialog());

            #region Formflow

            // Get any saved values
            StateClient sc = activity.GetStateClient();
            BotData userData = sc.BotState.GetPrivateConversationData(
                activity.ChannelId, activity.Conversation.Id, activity.From.Id);
            var boolProfileComplete = userData.GetProperty<bool>("ProfileComplete");
            if (!boolProfileComplete)
            {
                // Call our FormFlow by calling MakeRootDialog
                await Conversation.SendAsync(activity, MakeRootDialog);
            }
            else
            {
                //Check if Personalized Greeting is done
                if (userData.GetProperty<bool>("Greet"))
                {
                    ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                    await Conversation.SendAsync(activity, () => new QnADialog());
                }
                else
                {
                    // Get the saved profile values
                    var Name = userData.GetProperty<string>("Name");
                    userData.SetProperty<bool>("Greet", true);
                    sc.BotState.SetUserData(activity.ChannelId, activity.From.Id, userData);
                    ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                    Activity replyMessage = activity.CreateReply(string.Format("Hi {0}!", Name));
                    await connector.Conversations.ReplyToActivityAsync(replyMessage);
                }
            }
            #endregion
        }
        else
        {
            HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }
公共异步任务发布([FromBody]活动)
{
if(activity.Type==ActivityTypes.Message)
{
//ConnectorClient连接器=新的ConnectorClient(新Uri(activity.ServiceUrl));
//wait Conversation.SendAsync(活动,()=>new QnADialog());
#区域格式流
//获取任何保存的值
StateClient sc=activity.GetStateClient();
BotData userData=sc.BotState.GetPrivateConversationData(
activity.ChannelId、activity.Conversation.Id、activity.From.Id);
var boolProfileComplete=userData.GetProperty(“ProfileComplete”);
如果(!boolProfileComplete)
{
//通过调用MakeRootDialog调用我们的FormFlow
等待对话。SendAsync(活动,MakeRootDialog);
}
其他的
{
//检查是否完成了个性化问候
if(userData.GetProperty(“问候”))
{
ConnectorClient连接器=新的ConnectorClient(新Uri(activity.ServiceUrl));
wait Conversation.SendAsync(活动,()=>new QnADialog());
}
其他的
{
//获取保存的配置文件值
var Name=userData.GetProperty(“名称”);
SetProperty(“Greet”,true);
sc.BotState.SetUserData(activity.ChannelId、activity.From.Id、userData);
ConnectorClient连接器=新的ConnectorClient(新Uri(activity.ServiceUrl));
Activity replyMessage=Activity.CreateReply(string.Format(“Hi{0}!”,Name));
等待连接器.Conversations.ReplyToActivityAsync(replyMessage);
}
}
#端区
}
其他的
{
HandleSystemMessage(活动);
}
var response=Request.CreateResponse(HttpStatusCode.OK);
返回响应;
}
FormFlow

 [Serializable]
public class ProfileForm
{
    // these are the fields that will hold the data
    // we will gather with the form
    [Prompt("What is your name? {||}")]
    public string Name;

    // This method 'builds' the form 
    // This method will be called by code we will place
    // in the MakeRootDialog method of the MessagesControlller.cs file
    public static IForm<ProfileForm> BuildForm()
    {
        return new FormBuilder<ProfileForm>()
                .Message("Welcome to the profile bot!")
                .OnCompletion(async (context, profileForm) =>
                {
                    // Set BotUserData
                    context.PrivateConversationData.SetValue<bool>("ProfileComplete", true);
                    context.PrivateConversationData.SetValue<string>("Name", profileForm.Name);
                    // Tell the user that the form is complete
                    await context.PostAsync("Your profile is complete.");
                })
                .Build();
    }
}
[可序列化]
公共类档案表
{
//这些字段将保存数据
//我们将以表格形式聚会
[提示(“你叫什么名字?{|}”)]
公共字符串名称;
//此方法“构建”窗体
//此方法将由我们将放置的代码调用
//在MessagesController.cs文件的MakeRootDialog方法中
公共静态表单BuildForm()
{
返回新的FormBuilder()
.Message(“欢迎使用配置文件bot!”)
.OnCompletion(异步(上下文、配置文件格式)=>
{
//设置BotUserData
context.PrivateConversationData.SetValue(“ProfileComplete”,true);
context.PrivateConversationData.SetValue(“Name”,profileForm.Name);
//告诉用户表单已完成
wait context.PostAsync(“您的配置文件已完成”);
})
.Build();
}
}

在控制器中,首先获取私有会话数据存储,然后将其设置为Userdata数据存储。这样,您对私有会话存储的更改永远不会保存在私有会话数据存储中

改变

sc.BotState.SetUserData(activity.ChannelId, activity.From.Id, userData);


添加了setuserdata。但这仍然像一个魅力!另外,如果这是将对话转发到qnadialog的正确方式,您能帮我吗?它似乎不起作用。它仍然显示表单对话框(这是您的选择吗?)等待对话;它似乎不起作用。它仍然构建表单对话框。所以它一直在问我的名字在你的控制器中应该只有一个
对话。第一次调用此方法时,它会在会话堆栈上创建一个根对话框。在第一次调用之后,它所做的唯一事情就是将活动转发到会话堆栈的顶部(这仍然是您的表单)。为了正确地执行此操作,您应该在表单调用的ResumeAfter方法中启动QnADialog。我决定问一个新问题,因为这已经超出了范围。我希望你也能在那里帮助我。
sc.BotState.SetPrivateConversationData(activity.ChannelId, activity.Conversation.Id, activity.From.Id, userData);