Чатбот работает в эмуляторе и портале azure, но не запускается должным образом в веб-чате - PullRequest
2 голосов
/ 27 января 2020

Я создал своего C# базового чата в Visual Studio 2019, используя SDK v4. Бот-чат отображает порядок карт героев, чтобы начать чат. Он отлично работает в эмуляторе ботов и на портале azure, но при внедрении его в веб-чат с использованием Iframe карта героя не отображается. После передачи сообщения дважды показывает карту героя или если мы передаем значения кнопки карты героя, то это идет с потоком. Я не знаю, почему это происходит, и я новичок в этой области, и это мой первый чат-бот. Может кто-нибудь, пожалуйста, помогите мне разобраться в проблеме. Заранее спасибо

код в DialogAndWelcome Bot.cs

namespace Welcome.Bots

public class DialogAndWelcomeBot<T> : DialogBot<T>
    where T : Dialog
{
    public DialogAndWelcomeBot(ConversationState conversationState, UserState userState, T dialog, ILogger<DialogBot<T>> logger)
        : base(conversationState, userState, dialog, logger)
    {
    }

    protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        foreach (var member in membersAdded)
        {
            // Greet anyone that was not the target (recipient) of this message.
            // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
            if (member.Id != turnContext.Activity.Recipient.Id)
            {
                var response = MessageFactory.Text("Hi , I’m Alexa. How could I help you");
                await turnContext.SendActivityAsync(response, cancellationToken);
                await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
            }
            await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
        }
    }
}

код в DialogBot.cs

public DialogBot(ConversationState conversationState, UserState userState, T dialog, ILogger<DialogBot<T>> logger)
        {
            ConversationState = conversationState;
            UserState = userState;
            Dialog = dialog;
            Logger = logger;
        }

    public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        await base.OnTurnAsync(turnContext, cancellationToken);

        // Save any state changes that might have occured during the turn.
        await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
        await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
    }

Ответы [ 3 ]

2 голосов
/ 28 января 2020

@ Василий: Из вашего запроса я понимаю, что вы используете Webchannel для BOT и IFrame. Другими словами, если я не ошибаюсь, у вас есть файл html, в который вы скопировали и вставили встроенный код, предоставленный на портале azure, в приложение BOT и заменили заполнитель во встроенном коде на свой секретный ключ BOT. Т.е. что-то вроде ниже: https://webchat.botframework.com/embed/TestBotForOauthPrompt?s= <> 'style =' min-width: 400px; ширина: 100%; min-height: 500px; '>

Предполагая, что мое понимание именно здесь, я думаю, что Iframe - неправильный способ сделать это, только потому, что это не рекомендованный Microsoft способ сделать это для веб-канала, а вы использовать ответ, приведенный ниже. ПОЗИЦИИ StackOverflow:

  1. [BotFramework]: есть ли способ отобразить подсказку Oauth на карте героя или адаптивной карте в BOT, разработанной с использованием SDK V4 в C#?

Я знаю, что запрос в посте не говорит о приветственном сообщении, но в нем есть предложение --- Исправлено: удалите iframe и просто используйте код WebChat. Это нигде не задокументировано, но iFrame использует botchat, который является более старой версией WebChat.

Поскольку вы используете SDK V4, IFrame не следует использовать, вместо этого следует использовать HTML, предоставленный в ответах на пост выше.

Что касается вашего приветственного сообщения, я думаю, вам нужно использовать Поддержка обратного канала для его работы для веб-канала, который уже предоставлен в вышеприведенном посте.

И, наконец, если вы хотите, чтобы ваш бот веб-канала работал во всех браузерах, вам нужно взглянуть на приведенный ниже POST, который отвечает то же самое:

Как исправить проблему с страницей HTML для веб-чата Бот, разработанный в C# с использованием шаблона SDK V4, не открывается в браузере IE 11?

Надеюсь, что это поможет, и мое вышеупомянутое понимание верно.

Все эти ответы были проверены и работают и предоставлены инженерами службы поддержки в Microsoft

С уважением -ChaitanyaNG

1 голос
/ 28 января 2020

@ Решение BeschtPlaier будет работать нормально, но я также хотел предложить более простую альтернативу. Вы можете просто изменить условие с member.id != turnContext.activity.recipient.id на member.id === turnContext.activity.recipient.id. Таким образом, ваша функция onMembersAdded будет выглядеть следующим образом:

    protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        foreach (var member in membersAdded)
        {
            // Greet anyone that was not the target (recipient) of this message.
            // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
            if (member.Id === turnContext.Activity.Recipient.Id)
            {
                var response = MessageFactory.Text("Hi , I’m Alexa. How could I help you");
                await turnContext.SendActivityAsync(response, cancellationToken);
                await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
            }
            await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
        }
    }

Я использую этот метод для всех своих ботов и отлично работает как в эмуляторе, так и в развертывании на Azure. Лично я предпочитаю этот метод, так как вам не нужно беспокоиться о отслеживании имени бота.

1 голос
/ 28 января 2020

Это из-за того, как работает onMembersAdded. Это событие срабатывает, как только пользователь добавляется в чат (не при добавлении бота). В Webchat / DirectLine пользователь добавляется при отправке первого сообщения, поэтому приветственное сообщение отображается после первого сообщения, и это не то, как я предполагаю, что приветственные сообщения работают.

Вам понадобится обходной путь, чтобы получить Приветственное сообщение отправлено правильно.

Не уверен насчет рекомендуемого способа, но я так и сделал. (это прекрасно работает для меня) Замените onMembersAddedAsyn c следующим:

protected override async Task OnConversationUpdateActivityAsync(ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken){

    if(turnContext.Activity.MembersAdded[0].Name == turnContext.Activity.Recipient.Name){       
var response = MessageFactory.Text("Hi , I’m Alexa. How could I help you");
                await turnContext.SendActivityAsync(response, cancellationToken);
                await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
        }
    }  

Это будет отправлять приветственное сообщение каждый раз, когда всплывает ConversationUpdate. (Когда добавляется бот и когда добавляется пользователь) Мы хотим отправить сообщение, когда начинается чат -> Когда бот добавляется. (Пользователь добавляется ПОСЛЕ первого отправки сообщения. (В Webchat / DirectLine).

Редактировать из-за других ответов

Чтобы получить только одно сообщение, нам нужно проверить для получателя (всегда бот), в противном случае мы получим два приветственных сообщения (одно для бота, другое для пользователя)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...