спасибо за вклад. Не очень понял, как это сделать, но спасибо. Может быть, кто-то найдет это полезным.

добрый день,

Я создаю чат-бота для своей компании, и я начал с примеров на 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. Это может быть проблема или одна из проблем.

В основном это все, и я все еще привыкаю к ​​фреймворку. Я не ожидаю абсолютного ответа. Просто намеки / советы и советы, как сделать все лучше.

Заранее спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос