Der veröffentlichte C # Bot führt nach einiger Zeit zu einem internen Servererrors

Guten Tag allerseits,

Ich erstelle einen Chatbot für meine Firma und ich begann mit den Beispielen auf GitHub und den Framework-Dokumenten.

Wir entschieden uns, es auf Azure zu hosten und LUIS und Tabellenspeicher hinzuzufügen. Der Bot läuft lokal gut in Botframe Emulator, aber auf Azure (WebChat, Telegram) wird es nur ungefähr eine Stunde bis eine Stunde und fünfzehn Minuten laufen, wenn niemand versucht mit dem Bot zu kommunizieren. Nach Ablauf dieser Zeit läuft der Bot nur noch auf einen internen Servererrors. Wenn Sie den Bot etwas fragen, können Sie dieses Zeitfenster strecken (Wie lange weiß ich noch nicht und warum weiß ich auch nicht, tut mir leid).

In Azure ist ” Immer ein ” auf “Wahr” gesetzt.

Ich bin an dieser Stelle wirklich frustriert, weil ich das Problem nicht finden kann und ich bin ziemlich sicher, dass etwas mit meinem Code nicht stimmt, weil ich das Framework nicht richtig verstehe. Ich bin immer noch Anfänger mit Azure, C # und Bot Framework. Ich habe auch schon alles über “interne Servererrors” hier und github gelesen. Auch Debugging versucht, auch mit zusätzlichen Debug-Optionen in VS. Wir haben Application Insights noch nicht ausprobiert.

Im Moment mache ich alles mit dem LUIS-Dialog, der / zu anderen IDialogs aufruft:

[LuisIntent(Intent_Existens)] public async Task ExistensOf(IDialogContext context, IAwaitable message, LuisResult result) { var existens = new ExistensDialog(); var messageToForward = await message; if (result.Entities.Count == 1) { messageToForward.Value = result.Entities[0].Entity; await context.Forward(existens, AfterDialog, messageToForward); } else { context.Wait(this.MessageReceived); } } 

Ich weiß, dass “Value” für CardActions ist, aber ich weiß nicht, wie ich sonst Entitäten an den Child-Dialog übergeben könnte.

  [Serializable] public class ExistensDialog : IDialog { public async Task StartAsync(IDialogContext context) { context.Wait(MessageReceivedAsync); } private async Task MessageReceivedAsync(IDialogContext context, IAwaitable result) { var message = await result; if (message.Text.Contains("specificWord")) { await context.Forward(new ExistensHU(), AfterDialog, message); } else { await context.Forward(new ExistensBin(), AfterDialog, message); } } private async Task AfterDialog(IDialogContext context, IAwaitable result) { context.Done(null); } } 

dann:

  [Serializable] internal class ExistensHU : IDialog { private Renamer renamer = new Renamer(); // Just for renaming private ExternalConnection ec = new ExternalConnection(); //Just a HTTP connection to a WebApp to get data from it public async Task StartAsync(IDialogContext context) { context.Wait(MessageReceivedAsync); } private async Task MessageReceivedAsync(IDialogContext context, IAwaitable result) { const string apiCallURL = "some/API/"; // ExternalConnection... var message = await result; string nameHU = renamer.RemoveBlanks(message.Value.ToString()); StringBuilder answerBuilder = new StringBuilder(); var name = ec.CreateSingleAPIParameter("name", nameHU); Dictionary wms = await ec.APIResultAsDictionary(apiCallURL, name); foreach (var item in wms) { if (item.Key.Equals("none") && item.Value.Equals("none")) { answerBuilder.AppendLine($"Wrong Answer"); } else { answerBuilder.AppendLine($"Correct Answer"); } } await context.PostAsync(answerBuilder.ToString()); context.Done(null); } } 

Das ist im Grunde jeder Dialog in meinem Projekt. Ich habe auch einen IDialog, der so aussieht:

  [Serializable] public class VerificationDialog : IDialog { [NonSerializedAttribute] private readonly LuisResult _luisResult; public VerificationDialog(LuisResult luisResult) { _luisResult = luisResult; } public async Task StartAsync(IDialogContext context) { var message = _luisResult.Query; if (!message.StartsWith("Wie viele")) { context.Call(new ByVerificationDialog(_luisResult), AfterDialog); } else { context.Call(new CountBinsByVerification(_luisResult), AfterDialog); } } private async Task AfterDialog(IDialogContext context, IAwaitable result) { context.Done(null); } } 

Ich weiß nicht, ob ich das luisResult so von BasicLuisDialog weitergeben darf. Dies könnte das Problem oder eines der Probleme sein.

Im Grunde ist es das und ich gewöhne mich immer noch an das Framework. Ich erwarte keine absolute Antwort. Nur Tipps / Ratschläge, wie man alles besser macht.

Danke im Voraus!

Wenn Sie die .NET SDK Version 3.14.0.7 verwenden. Es gibt derzeit einen Bug, den wir in dieser Version verfolgen. Es gab eine Reihe von Berichten, und wir untersuchen aktiv. Bitte versuchen Sie das Downgrade auf 3.13.1. Dies sollte das Problem für Sie beheben, bis wir eine neue Version veröffentlichen können.

Als Referenz verfolgen wir das Problem bei diesen GitHub-Problemen: https://github.com/Microsoft/BotBuilder/issues/4322 https://github.com/Microsoft/BotBuilder/issues/4321

Update 21.03.2018:

Wir haben eine neue Version des SDK geposted, das eine Fehlerbehebung für dieses Problem enthält https://www.nuget.org/packages/Microsoft.Bot.Builder/3.14.1.1

Interner Fehler bedeutet normalerweise Ausnahmen in der .NET-Anwendung.

Verwenden Sie AppDomain.CurrentDomain.UnhandledException , um alle nicht behandelten Ausnahmen zu empfangen und sie irgendwo zu protokollieren (in Betracht ziehen, Application Insights zu verwenden ). Nachdem Sie die protokollierten Informationen untersucht haben, beheben Sie dies.