如何避免&;对不起,我的机器人代码有问题&;在Microsoft Bot框架

本文关键字:有问题 Microsoft Bot 代码 框架 我的 何避免 对不起 机器人 | 更新日期: 2023-09-27 18:07:56

我有一个在Azure上运行的bot + bot框架+ LUIS(通过LuisDialog)。

如果用户碰巧在短时间内连续发送两条消息(在机器人有机会回答之前),他们会在他们的Facebook Messenger或web嵌入中看到这个错误消息:

对不起,我的bot代码有问题。

通过bot通道模拟器调试时,我看到错误如下:

"text": "Error: Response status code does not indication success: 429 .(太多的请求)。在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)Microsoft.Bot.Builder.Luis.LuisService.d__4.MoveNext ()

堆栈跟踪的末尾显示错误起源于我的messageconcontroller .cs中的这一行:

await Conversation.SendAsync(activity, () => new LuisRootDialogEnglish());

这很奇怪,因为我使用的是付费版本的LUIS,它允许每秒最多10个调用。

在任何情况下,我尝试将MessageController.cs中的整个代码包装成try/catch块,并返回此值,而不管异常:

return Request.CreateResponse(HttpStatusCode.OK);

仍然,用户看到错误信息"对不起,我的机器人代码有一个问题",这基本上意味着有一个未处理的异常。

如何阻止此消息显示给用户,或捕获异常?

如何避免&;对不起,我的机器人代码有问题&;在Microsoft Bot框架

消息被发送给PostUnhandledExceptionToUserTask中的用户仅仅是因为异常已经转义了根对话框a。您可以通过防止未处理的异常转义根对话框a来避免这种情况。

一个选项是添加一个不同的根对话框B,它简单地调用您的对话框a,然后简单地忽略传递给ResumeAfter<R>回调的IAwaitable<R>结果。

Chain.DefaultIfException提供了对话框b的实现。

您可以使用DefaultIfException功能为Bot框架内部处理异常。

它看起来像这样:

await Conversation.SendAsync(
   activity, () => new Dialogs.RootDialog().DefaultIfException()
);

当你得到403或429时,它可能是' out of quota"或"请求太多";分别,在第一种情况下,你必须再次创建一个密钥并分配到你的LUIS应用程序,前1000个端点查询是免费的,它将每月刷新,你必须明智地使用它,否则你必须使用付费层。

对于第二种情况,您也有请求的限制,请参阅Boundaries文档

你可以在这里找到微软关于这个的文档