如何避免&;对不起,我的机器人代码有问题&;在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);
仍然,用户看到错误信息"对不起,我的机器人代码有一个问题",这基本上意味着有一个未处理的异常。
如何阻止此消息显示给用户,或捕获异常?
消息被发送给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文档
你可以在这里找到微软关于这个的文档