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