已发布的C#Bot在一段时间后会遇到内部服务器错误

今天是个好日子,

我正在为我的公司创建一个聊天机器人,我开始使用github上的示例和框架文档。

我们决定在Azure上托管它,并为其添加了LUIS和表存储。 Bot在Botframework Emulator中本地运行良好,但在Azure(WebChat,Telegram)上,如果没有人试图与机器人通信,它将只运行大约一小时到一小时十五分钟。 在这段时间之后,机器人将遇到内部服务器错误。 当你问机器人的东西时,你可以延长这个时间窗口(我不知道多长时间以及为什么我也不知道,对不起)。

在Azure中,“ Always On ”设置为true。

在这一点上我真的很沮丧,因为我找不到问题而且我很确定我的代码一定有问题,因为我没有正确理解框架。 我还是Azure,C#和Bot Framework的初学者。 此外,我已经在这里和github上阅读了“内部服务器错误”的所有内容。 还尝试了调试,即使VS中有额外的Debbug选项。 我们还没有尝试过Application Insights。

目前我正在使用LUIS Dialog调用/转发给其他IDialogs:

[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); } } 

我知道“值”是针对CardActions的,但我不知道如何将实体传递给子对话框。

  [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); } } 

然后:

  [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); } } 

这基本上是我项目中的每个Dialog。 我也有一个IDialog,看起来像这样:

  [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); } } 

我不知道是否允许我从BasicLuisDialog传递这样的luisResult。 这可能是问题或其中一个问题。

基本上就是这样,我仍然习惯了框架。 我不期待一个绝对的答案。 只是提示/提示和建议如何让一切变得更好。

提前致谢!

如果您使用的是.NET SDK 3.14.0.7版。 目前我们正在跟踪此版本中的错误。 有很多报道,我们正在积极调查。 请尝试降级到3.13.1。 在我们发布新版本之前,这应该为您解决问题。

作为参考,我们正在跟踪这些GitHub问题: https : //github.com/Microsoft/BotBuilder/issues/4322 https://github.com/Microsoft/BotBuilder/issues/4321

更新3/21/2018:

我们推出了新版本的SDK,其中包含针对此问题的修复程序https://www.nuget.org/packages/Microsoft.Bot.Builder/3.14.1.1

内部错误通常表示.NET应用程序中的exception。

使用AppDomain.CurrentDomain.UnhandledException接收所有未处理的exception并将其记录在某处(请考虑使用Application Insights )。 在您调查记录的信息后修复它。