C# Microsoft Bot Framework退出对话框并处置父项

C# Microsoft Bot Framework退出对话框并处置父项,c#,botframework,C#,Botframework,我有4个对话框,如果满足某个条件,每个对话框都作为子对话框生成。 当我在本地进行测试时,一切正常,但当我发布到azure时,一切都不正常。 我得到一个一般性错误: 抱歉,我的机器人程序代码有问题 我相信我已经确定了问题所在,所以我想将消息发布给客户,然后退出所有内容。 我有这个方法: /// <summary> /// Gets our products /// </summary> /// <returns></returns> private

我有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);
//
///得到我们的产品
/// 
/// 
专用异步任务GetCurrentProducts(IDialogContext上下文)
{
尝试
{
//如果我们没有任何产品,就去买
如果(_products==null)
_products=await_productProvider.ListAsync();
}捕获(例外情况除外)
{
//抛开我们的错误
wait context.PostAsync(例如Message);
//退出我们的对话
等待ResumeAfter(上下文,空);
}
//退回我们的过滤产品
退货产品;
}
/// 
///子对话框完成后,将其标记为“完成”
/// 
///当前环境
///结果对象
/// 
私有异步任务ResumeAfter(IDialogContext上下文,IAwaitable结果)=>context.Done(null);

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

首先,我相信产品的退货应该在您的试用区内

context.Done
将仅结束当前对话框,而不是堆栈中的所有对话框。事实上,
context.Done
将触发调用当前对话框时定义的
ResumeAfter
方法(即在父对话框中)

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


您可以在.

中了解更多关于这方面的信息。我不能在try-catch块中返回产品,因为它抱怨不是所有代码路径都返回结果(即使使用context.Fail)。除此之外,你建议的其他一切都很好。