J'ai un bot qui fonctionne sur Azure + Bot Framework + LUIS (via LuisDialog).
Si l'utilisateur envoie deux messages en une succession rapide (avant que le bot n'ait la chance de répondre), il voit ce message d'erreur sur son Facebook Messenger ou son intégration Web:
Désolé, mon code bot a un problème.
Lors du débogage via l'émulateur de canal bot, je vois que l'erreur est la suivante:
"text": "Erreur: le code d'état de réponse n'indique pas la réussite: 429 (Too Many Requests). à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task) Microsoft.Bot.Builder.Luis.LuisService.d__4.MoveNext ()
La fin de la trace de pile montre que l'erreur provient de cette ligne dans mon MessageController.cs:
await Conversation.SendAsync(activity, () => new LuisRootDialogEnglish());
C'est bizarre car j'utilise une version payante de LUIS qui permet jusqu'à 10 appels par seconde.
Dans tous les cas, j'ai essayé d'encapsuler tout le code de MessageController.cs dans un try/catch
block, et renvoyant cette valeur indépendamment d'une exception:
return Request.CreateResponse(HttpStatusCode.OK);
Pourtant, les utilisateurs voient le message d'erreur "Désolé, mon code bot a un problème", ce qui signifie qu'il existe une exception non gérée.
Comment empêcher l'affichage de ce message aux utilisateurs ou intercepter l'exception?
Le message est envoyé à l'utilisateur dans PostUnhandledExceptionToUserTask
uniquement parce que l'exception a échappé à la boîte de dialogue racine A. Vous pouvez éviter cette situation en empêchant les exceptions non gérées d'échapper à la boîte de dialogue racine A.
Une option consiste à ajouter une boîte de dialogue racine différente B qui appelle simplement votre boîte de dialogue A, puis ignore simplement le IAwaitable<R>
résultat transmis au ResumeAfter<R>
rappeler.
Chain.DefaultIfException
fournit une implémentation de la boîte de dialogue B.
Vous pouvez utiliser la fonctionnalité DefaultIfException
pour Bot Framework pour gérer en interne l'exception.
Cela ressemble à ceci:
await Conversation.SendAsync(
activity, () => new Dialogs.RootDialog().DefaultIfException()
);
Lorsque vous obtenez un 403 ou 429, il peut s'agir respectivement de "hors quota" ou de "trop de demandes", dans le premier cas, vous devez recréer une clé et vous affecter à votre application LUIS, les premières 1000 requêtes de point de terminaison sont gratuites et il sera actualisé tous les mois, vous devez l'utiliser à bon escient ou vous devez utiliser un niveau Payant.
Pour le deuxième cas, vous avez également une limite pour la demande, voir Documentation des limites
Ici vous pouvez trouver Microsoft documentation à ce sujet.