C# Bot框架对话框链返回值两次?

C# Bot框架对话框链返回值两次?,c#,botframework,C#,Botframework,我正试图理解C#的MicrosoftBot框架 当我说“1”时,它返回“said 1”两次,当我说“2”时,它返回“said 2”两次,以此类推。我不明白为什么这是返回值两次。我还注意到,若在测试中设置了断点,它将永远不会被命中。关于对话链,我不了解的是什么?我已经看过了 我有一个简单的类TestDialog。 在MessagesController.cs中,我将其实例化为: public async Task<HttpResponseMessage> Post([FromB

我正试图理解C#的MicrosoftBot框架

当我说“1”时,它返回“said 1”两次,当我说“2”时,它返回“said 2”两次,以此类推。我不明白为什么这是返回值两次。我还注意到,若在测试中设置了断点,它将永远不会被命中。关于对话链,我不了解的是什么?我已经看过了

我有一个简单的类TestDialog。 在MessagesController.cs中,我将其实例化为:

    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.Type == ActivityTypes.Message)
        {

            await Conversation.SendAsync(activity, () => TestDialog.dialog);

        }
    }
公共异步任务发布([FromBody]活动)
{
if(activity.Type==ActivityTypes.Message)
{
wait Conversation.sendaync(活动,()=>TestDialog.dialog);
}
}
这里是TestDialog.cs

public class TestDialog : IDialog<string>
    {

        public static readonly IDialog<string> dialog = Chain
            .PostToChain()
            .Switch(

                new Case<IMessageActivity, IDialog<string>>((msg) =>
                {
                    var regex = new Regex("^1", RegexOptions.IgnoreCase);
                    return regex.IsMatch(msg.Text);
                }, (ctx, msg) =>
                {
                    return Chain.Return("said 1");
                }),


                 new Case<IMessageActivity, IDialog<string>>((msg) =>
                 {
                     var regex = new Regex("^2", RegexOptions.IgnoreCase);
                     return regex.IsMatch(msg.Text);
                 }, (ctx, msg) =>
                 {
                     return Chain.Return("said 2");
                 }),



                new DefaultCase<IMessageActivity, IDialog<string>>((ctx, msg) =>
                {
                        return Chain.Return("default");
                })
            ).Unwrap().PostToUser();


        public async Task StartAsync(IDialogContext context)
        {
            await Test(context);
        }

        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
        {

                await Test(context);
        }


        private async Task Test(IDialogContext context)
        {

            if (true)
            {
                context.Wait(MessageReceivedAsync);
            }
            else
            {
                context.Done("done");
            }
        }

    }
公共类测试对话框:IDialog
{
公共静态只读IDialog对话框=链
.PostToChain()
.开关(
新案例((msg)=>
{
var regex=new regex(“^1”,RegexOptions.IgnoreCase);
返回regex.IsMatch(msg.Text);
},(ctx,味精)=>
{
返回链。返回(“所述1”);
}),
新案例((msg)=>
{
var regex=new regex(“^2”,RegexOptions.IgnoreCase);
返回regex.IsMatch(msg.Text);
},(ctx,味精)=>
{
返回链。返回(“所述2”);
}),
新的DefaultCase((ctx,msg)=>
{
退货链。退货(“默认”);
})
).Unwrap().PostToUser();
公共异步任务StartAsync(IDialogContext上下文)
{
等待测试(上下文);
}
专用异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable参数)
{
等待测试(上下文);
}
专用异步任务测试(IDialogContext上下文)
{
如果(真)
{
Wait(MessageReceivedAsync);
}
其他的
{
上下文。完成(“完成”);
}
}
}

有人经历过这种情况吗?

我使用过chain dialog;然而,由于这些问题,也不支持一些想法,我更喜欢使用context.call和context.forward,它们写在dialog-to-chain-dialog中;然而,由于这些问题,并且也不支持某些想法,我更喜欢使用context.call和context.forward,它们是在dialog-to-chain对话框中编写的。