2017-01-09 3 views
0

私は4つのダイアログを持っていますが、特定の条件が満たされた場合はそれぞれが子として生成されます。 私がローカルでテストすると、すべてうまく動作しますが、私が紺碧にパブリッシュすると、うまく動作しません。 は、私は一般的なエラーが出る:Microsoft Bot Frameworkの終了ダイアログと親を破棄します

Sorry, my bot code is having an issue.

私は、問題がどこにあるか、私が発見したと信じていたので、私はクライアントにメッセージを投稿してから、すべてを終了します。 私はこの方法を持っている:

/// <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); 

エラーがある場合、それはユーザーにエラーメッセージを投稿する必要があり、それはcontext.Doneを呼び出しResumeAfterを起動します。私はそれが現在のダイアログと他のすべてのものを終了すべきだと思う。これは正しいですか?あるいは、私がそれをやっていなければならない別の方法があります。すべてのダイアログが実装されていますIDialog<object>

答えて

0

まず、製品の返品はtryブロックの内側にあるべきです。

は、スタック内のすべてのダイアログではなく、現在のダイアログを終了させます。実際には、context.Doneは、この現在のダイアログ(親ダイアログの意味)を呼び出したときに定義する​​メソッドをトリガーします。

また、例外を返す場合はcontext.Failを使用することもできます。その場合は、親の​​メソッドで例外を処理する必要があります。

詳しくはMulti-Dialogs sampleをご覧ください。

+0

try catchブロックで商品を返すことはできません。なぜなら、(context.Failを使用していても)すべてのコードパスが結果を返すとは限らないからです。それ以外は、あなたが提案したものはすべて素晴らしいものでした。 – r3plica

関連する問題