Azure + Bot Framework + LUIS(LuisDialog経由)で実行されるボットがあります。
ユーザーがたまたま2つのメッセージを連続して送信した場合(ボットが応答する前に)、Facebook MessengerまたはWeb埋め込みにこのエラーメッセージが表示されます。
申し訳ありませんが、ボットコードに問題があります。
ボットチャネルエミュレータを介してデバッグすると、エラーは次のようになります。
「テキスト」:「エラー:応答ステータスコードは成功を示しません:429(Too Many Requests)。at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) Microsoft.Bot.Builder.Luis.LuisService.d__4.MoveNext()
スタックトレースの最後は、MessageController.csの次の行でエラーが発生したことを示しています。
await Conversation.SendAsync(activity, () => new LuisRootDialogEnglish());
これは、1秒あたり最大10回の呼び出しが可能なLUISの有料版を使用しているため、奇妙です。
いずれにせよ、MessageController.csのコード全体をtry/catch
ブロックにラップし、例外に関係なくこの値を返しました。
return Request.CreateResponse(HttpStatusCode.OK);
それでも、ユーザーには「申し訳ありませんが、ボットコードに問題があります」というエラーメッセージが表示されます。これは、基本的に未処理の例外があることを意味します。
このメッセージがユーザーに表示されないようにする、または例外をキャッチするにはどうすればよいですか?
例外がルートダイアログAをエスケープしたため、メッセージはPostUnhandledExceptionToUserTask
でユーザーに送信されます。未処理の例外がルートダイアログAをエスケープしないようにすることで、この状況を回避できます。
1つのオプションは、ダイアログAを単に呼び出し、IAwaitable<R>
コールバックに渡されるResumeAfter<R>
結果を単に無視する別のルートダイアログBを追加することです。
Chain.DefaultIfException
は、ダイアログBの実装を提供します。
Bot FrameworkのDefaultIfException
機能を使用して、例外を内部的に処理できます。
次のようになります。
await Conversation.SendAsync(
activity, () => new Dialogs.RootDialog().DefaultIfException()
);
403または429を取得すると、それぞれ「クォータを超えている」または「要求が多すぎる」可能性があります。最初の場合は、キーを再作成してLUISアプリに署名する必要があります。毎月更新されるため、賢明に使用するか、有料ティアを使用する必要があります。
2番目の場合、リクエストの制限もあります。 Boundaries documentation をご覧ください。
ここで、Microsoft documentation についてこれを見つけることができます。