Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Botframework 从Chain.from().Do()清除Bot状态数据返回;抱歉,我的机器人程序代码有问题;_Botframework - Fatal编程技术网

Botframework 从Chain.from().Do()清除Bot状态数据返回;抱歉,我的机器人程序代码有问题;

Botframework 从Chain.from().Do()清除Bot状态数据返回;抱歉,我的机器人程序代码有问题;,botframework,Botframework,试图在此代码中设置用户数据,并不断返回“抱歉,我的bot代码有问题” 内部静态IDialog MakeRootDialog() { 返回链.From(()=>FormDialog.FromForm(SandwichOrder.BuildForm)) .Do(异步(上下文、顺序)=> { 尝试 { var-activity=context.activity; var channelId=activity.channelId; var fromId=activity.From.Id; var sta

试图在此代码中设置用户数据,并不断返回“抱歉,我的bot代码有问题”

内部静态IDialog MakeRootDialog()
{
返回链.From(()=>FormDialog.FromForm(SandwichOrder.BuildForm))
.Do(异步(上下文、顺序)=>
{
尝试
{
var-activity=context.activity;
var channelId=activity.channelId;
var fromId=activity.From.Id;
var stateClient=activity.GetStateClient();
**var userData=await stateClient.BotState.GetUserDataAsync(activity.ChannelId,activity.From.Id);
//修改用户数据中的属性
SetProperty(“SerialNumber”,即“”);
//保存更新的用户数据
等待stateClient.BotState.SetUserDataAsync(activity.ChannelId、activity.From.Id、userData)**
var完成=等待订单;
//实际处理三明治订单。。。
wait context.PostAsync(“已提交缺陷数据!”);
}
捕获(HttpOperationException错误)
{
//HTTP状态代码为412的句柄错误前置条件失败
}
捕获(FormCanceledException e)
{
字符串回复;
if(e.InnerException==null)
{
reply=$“您在{e.Last}上退出--也许下次可以完成!”;
}
其他的
{
reply=“对不起,我短路了。请再试一次。”;
}
等待上下文。PostAsync(回复);
}
});
}

它实际上正在工作并清除属性,但我不想再看到该错误消息,而不是使用activity.GetStateClient(),使用对话框上下文的方法操纵对话框方法内部的状态

所发生的是,在加载对话框时,状态被反序列化,并在对话框完成时自动保存。如果在对话框中手动创建状态客户端并操纵状态,则在自动保存时会发生冲突


编辑: 这与预期的一样

在控制器中:

var stateClient = activity.GetStateClient(); // this is the default state client (recommended only for prototyping)

var userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
userData.SetProperty<string>("SerialNumber", "test serial number");
await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

await Conversation.SendAsync(activity, TestForm.MakeRootDialog);

userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id); //after the form completes, SerialNumber is empty here
var stateClient=activity.GetStateClient()// 这是默认的状态客户端(建议仅用于原型设计)
var userData=await stateClient.BotState.GetUserDataAsync(activity.ChannelId,activity.From.Id);
SetProperty(“SerialNumber”、“测试序列号”);
等待stateClient.BotState.SetUserDataAsync(activity.ChannelId、activity.From.Id、userData);
wait Conversation.SendAsync(活动,TestForm.MakeRootDialog);
userData=await stateClient.BotState.GetUserDataAsync(activity.ChannelId,activity.From.Id)//表单完成后,SerialNumber在此为空
表格:

public class TestForm
{
    internal static IDialog<SandwichOrder> MakeRootDialog()
    {
        return Chain.From(() => FormDialog.FromForm(SandwichOrder.BuildForm))
            .Do(async (context, order) =>
            {

                    var serialNumber = context.UserData.GetValue<string>("SerialNumber");

                    context.UserData.SetValue("SerialNumber", "");

                    var completed = await order;
                    // Actually process the sandwich order...
                    await context.PostAsync("Defect data submitted!");                    
            });
    }
}
公共类TestForm
{
内部静态IDialog MakeRootDialog()
{
返回链.From(()=>FormDialog.FromForm(SandwichOrder.BuildForm))
.Do(异步(上下文、顺序)=>
{
var serialNumber=context.UserData.GetValue(“serialNumber”);
context.UserData.SetValue(“SerialNumber”,即“”);
var完成=等待订单;
//实际处理三明治订单。。。
wait context.PostAsync(“已提交缺陷数据!”);
});
}
}

Hi Eric,我实际上是在调用MessageController代码中的静态IDialog MakeRootDialog()之前设置状态。我必须这样做,因为我需要先读取条形码附件(提取序列号),因为表单对话框不支持附件。调用context.ConversationData.SetValue(“SerialNumber”,即“”);您是否有自定义状态客户端?或者您正在使用Azure扩展?我刚刚测试了:context.ConversationData.SetValue(“SerialNumber”),那对您的场景不起作用呢?我没有使用任何自定义状态客户端或Azure扩展。。。。在调用MakeRootDialog之前,在MessageController中,我要求用户提供条形码图像(或手动输入)。然后我将序列号保存在对话框上下文之外的用户数据状态中。。。然后,我启动对话框,通过表单交互从用户那里获取所需的其他信息。我需要在下一次行动之前清除这个状态。我将重复调用context.ConversationData.SetValue(“SerialNumber”,即“”)的过程;不起作用。序列号仍在用户数据状态中。。。它现在的工作代码不正确:context.ConversationData.SetValue(“SerialNumber”,下称“);正确的代码(如您所建议的):context.UserData.SetValue(“SerialNumber”,即“”);
public class TestForm
{
    internal static IDialog<SandwichOrder> MakeRootDialog()
    {
        return Chain.From(() => FormDialog.FromForm(SandwichOrder.BuildForm))
            .Do(async (context, order) =>
            {

                    var serialNumber = context.UserData.GetValue<string>("SerialNumber");

                    context.UserData.SetValue("SerialNumber", "");

                    var completed = await order;
                    // Actually process the sandwich order...
                    await context.PostAsync("Defect data submitted!");                    
            });
    }
}