спасибо за вклад. Не очень понял, как это сделать, но спасибо. Может быть, кто-то найдет это полезным.
добрый день,
Я создаю чат-бота для своей компании, и я начал с примеров на github и документах по фреймворку.
Мы решили разместить его на Azure и добавили в него LUIS и Table Storage. Бот отлично работает локально в эмуляторе Botframework, но в Azure (WebChat, Telegram) он будет работать приблизительно от часа до часа и пятнадцати минут, если никто не попытается связаться с ботом. По истечении этого времени бот просто столкнется с внутренней ошибкой сервера. Когда вы спрашиваете у бота что-то, вы можете растянуть это временное окно (Как долго я не знаю и почему я тоже не знаю, извините).
В лазури "Всегда включен"имеет значение true.
Я действительно разочарован в этом моменте, потому что я не могу найти проблему, и я почти уверен, что с моим кодом должно быть что-то не так, потому что я не совсем понимаю структуру. Я все еще начинающий с Azure, C # и Bot Framework. Также я уже прочитал все о «внутренней ошибке сервера» здесь и github. Также пробовал отладку, даже с дополнительными опциями Debbug в VS. У нас естьне попробовал Application Insights еще.
На данный момент я делаю все с помощью диалога LUIS, который вызывает / пересылает другим IDialogs:
[LuisIntent(Intent_Existens)]
public async Task ExistensOf(IDialogContext context, IAwaitable<IMessageActivity> 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<object>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> 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<object> result)
{
context.Done<object>(null);
}
}
тогда:
[Serializable]
internal class ExistensHU : IDialog<object>
{
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<IMessageActivity> 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<string, string> 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<object>(null);
}
}
Это в основном каждый диалог в моем проекте. Также у меня есть IDialog, который выглядит так:
[Serializable]
public class VerificationDialog : IDialog<object>
{
[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<object> result)
{
context.Done<object>(null);
}
}
Я не знаю, разрешено ли мне передавать luisResult таким образом из BasicLuisDialog. Это может быть проблема или одна из проблем.
В основном это все, и я все еще привыкаю к фреймворку. Я не ожидаю абсолютного ответа. Просто намеки / советы и советы, как сделать все лучше.
Заранее спасибо!