Bots Microsoft Bot Framework-主动消息,暂停当前对话框

Bots Microsoft Bot Framework-主动消息,暂停当前对话框,bots,botframework,Bots,Botframework,我创建了一个简单的新闻机器人,它每24小时向用户发送一次更新。我已经创建了一个回调控制器,它处理来自外部服务的请求,处理resumptionCookie,然后向用户发送带有两个按钮的文章旋转木马。其中一个按钮打开浏览器窗口,另一个按钮应触发新对话框(选项对话框) 这个实现正确吗?当用户与新闻文章消息交互时,是否可以暂停任何活动对话框?例如,如果我正在浏览一个特定的对话框,然后突然收到一个新闻警报,是否可以暂停当前对话框,以允许用户更新警报选项(几乎就像新闻警报在正常对话框流之外),然后一旦完成,

我创建了一个简单的新闻机器人,它每24小时向用户发送一次更新。我已经创建了一个回调控制器,它处理来自外部服务的请求,处理resumptionCookie,然后向用户发送带有两个按钮的文章旋转木马。其中一个按钮打开浏览器窗口,另一个按钮应触发新对话框(选项对话框)

这个实现正确吗?当用户与新闻文章消息交互时,是否可以暂停任何活动对话框?例如,如果我正在浏览一个特定的对话框,然后突然收到一个新闻警报,是否可以暂停当前对话框,以允许用户更新警报选项(几乎就像新闻警报在正常对话框流之外),然后一旦完成,他们将返回上一个对话框。希望这个问题足够清楚。任何帮助都将不胜感激

public class CallbackController : ApiController
{
    public async Task<IHttpActionResult> Post(ResumptionCookie resumptionCookie)
    {
        var activity = (Activity)resumptionCookie.GetMessage();

        var reply = activity.CreateReply();
        reply.Text = "We found 7 news articles that match your criteria";
        reply.Attachments = new List<Attachment>
        {
            new ThumbnailCard
            {
                Buttons = new List<CardAction>
                {
                    new CardAction(ActionTypes.OpenUrl, "BBC", null, "http://www.bbc.co.uk"),
                    new CardAction(ActionTypes.PostBack, "Update Options", null, "Update Options")
                }
            }.ToAttachment()
        };

        var client = new ConnectorClient(new Uri(activity.ServiceUrl));
        await client.Conversations.ReplyToActivityAsync(reply);

        return Ok(new { success = true });
    }
}
公共类回调控制器:ApiController
{
公共异步任务发布(ResumptionCookie ResumptionCookie)
{
var activity=(activity)resumptionCookie.GetMessage();
var reply=activity.CreateReply();
reply.Text=“我们找到了7篇符合您标准的新闻文章”;
答复.附件=新列表
{
新拇指指甲卡
{
按钮=新列表
{
新的CardAction(ActionTypes.OpenUrl,“BBC”,null,“http://www.bbc.co.uk"),
新建CardAction(ActionTypes.PostBack,“更新选项”,null,“更新选项”)
}
}.ToAttachment()
};
var client=newconnectorclient(新Uri(activity.ServiceUrl));
等待client.Conversations.ReplyToActivityAsync(reply);
返回Ok(新的{success=true});
}
}
这是我的主要对话

[Serializable]
public class MainDialog : IDialog
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(ProcessMessage);
    }

    private async Task ProcessMessage(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var response = await result;

        if (response.Text.Equals("Update Options", StringComparison.OrdinalIgnoreCase))
        {
            context.Call(new OptionsDialog(), FinishMainDialog);
        }
        else
        {
            PromptDialog.Confirm(context, ProcessChoice, "Do you wish to continue?");
        }
    }

    private async Task ProcessChoice(IDialogContext context, IAwaitable<bool> result)
    {
        var choice = await result;

        if(choice)
        {
            context.Call(new DialogOne(), FinishMainDialog);
        }
        else
        {
            context.Done(true);
        }
    }

    private async Task FinishMainDialog(IDialogContext context, IAwaitable<object> result)
    {
        context.Done(true);
    }
}
[可序列化]
公共类main对话框:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
Wait(ProcessMessage);
}
专用异步任务ProcessMessage(IDialogContext上下文,IAwaitable结果)
{
var响应=等待结果;
if(response.Text.Equals(“更新选项”,StringComparison.OrdinalIgnoreCase))
{
调用(新选项对话框(),FinishMainDialog);
}
其他的
{
PromptDialog.Confirm(上下文,进程选项,“是否继续?”);
}
}
专用异步任务ProcessChoice(IDialogContext上下文,IAwaitable结果)
{
var选择=等待结果;
如果(选择)
{
调用(new DialogOne(),FinishMainDialog);
}
其他的
{
上下文。完成(true);
}
}
专用异步任务FinishMain对话框(IDialogContext上下文,IAwaitable结果)
{
上下文。完成(true);
}
}
这是我的频率对话框

[Serializable]
public class OptionsDialog : IDialog
{
    public async Task StartAsync(IDialogContext context)
    {
        await context.PostAsync("You can update your to options here");

        context.Wait(ProcessMessage);
    }

    public async Task ProcessMessage(IDialogContext context, IAwaitable<IMessageActivity> activity)
    {

        await context.PostAsync("Hello, World!");
        context.Done(true);
    }
}
[可序列化]
公共类选项对话框:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
wait context.PostAsync(“您可以在此处更新您的收件人选项”);
Wait(ProcessMessage);
}
公共异步任务ProcessMessage(IDialogContext上下文,IAwaitable活动)
{
等待上下文。PostAsync(“你好,世界!”);
上下文。完成(true);
}
}

收到通知时会发生什么情况?机器人失败了?或者?@BobSwager如果通知呈现正确,我的问题是当用户单击通知上的“更新选项”按钮时,我不确定是否正确处理了响应。您可以使用Emulator和debug。你可以看到你的流动。如果你陷入困境,那么写评论,我们会一起努力解决。