我有 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>
首先,我相信产品的退货应该在你的尝试块内。
context.Done
只会结束当前对话框,而不是堆栈中的所有对话框。实际上,context.Done
将触发您在调用此当前对话框时定义的ResumeAfter<T>
方法(在父对话中的含义)。
返回异常,也可以使用 context.Fail
,在这种情况下,您必须在父级的 ResumeAfter<T>
方法中处理异常。
可以在多对话框示例中阅读有关此内容的详细信息。