Microsoft Bot Framework退出对话框并处理父项

时间:2017-01-09 13:25:30

标签: c# botframework

我有4个对话框,如果满足某个条件,每个对话框都会产生一个孩子。 当我在本地测试时,一切正常,但是当我发布到azure时,它没有。 我收到一般错误:

  

抱歉,我的机器人代码存在问题。

我相信我已经确定了问题所在,所以我想将消息发布到客户端然后退出所有内容。 我有这个方法:

/// <summary>
/// Gets our products
/// </summary>
/// <returns></returns>
private async Task<List<ProductResponseModel>> GetCurrentProducts(IDialogContext context)
{

    try
    {

        // If we don't have any products, get them
        if (_products == null)
            _products = await _productProvider.ListAsync();

    } catch (Exception ex)
    {

        // Throw our error
        await context.PostAsync(ex.Message);

        // Exit our dialog
        await ResumeAfter(context, null);
    }

    // Return our filtered products
    return _products;
}

/// <summary>
/// When the child dialog has completed, mark this as done
/// </summary>
/// <param name="context">The current context</param>
/// <param name="result">The result object</param>
/// <returns></returns>
private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) => context.Done<IMessageActivity>(null);

如果出现错误,则应将错误消息发布给用户,然后调用 ResumeAfter 调用context.Done。我认为应该结束当前的对话和所有其他对话。这是正确的吗?或者我应该采取另一种方式。我的所有对话框都实现了IDialog<object>

1 个答案:

答案 0 :(得分:0)

首先,我相信产品的退货应该在你的试块内。

context.Done将结束当前对话框,而不是堆栈中的所有对话框。事实上,context.Done将触发您在调用此当前对话框时定义的ResumeAfter<T>方法(意味着在父对话框中)。

或者,如果要返回异常,也可以使用context.Fail,在这种情况下,您必须在父级的ResumeAfter<T>方法中处理异常。

您可以在Multi-Dialogs sample

中详细了解相关信息