[BotFramework]: Как исправить: Приветственное сообщение не отображается пользователю в C # WebChatBot, разработанном в V4, но отображаемом в эмуляторе? - PullRequest
0 голосов
/ 13 мая 2019

<!DOCTYPE html>
<html>
<head>
    <title>Avanade D365 F&O Assets BOT</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <!--
      For demonstration purposes, we are using development branch of Web Chat at "/master/webchat.js".
      When you are using Web Chat for production, you should use the latest stable at "/latest/webchat.js".
      Or locked down on a specific version "/4.1.0/webchat.js".
    -->
    <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    <style>
        html, body {
            height: 100%
        }

        body {
            margin: 0
        }

        #webchat {
            height: 100%;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="webchat" role="main">
        <iframe src='https://webchat.botframework.com/embed/AssetsBot?s=<<given my code here as it is secret i have attached this removing the code>>' style='min-width: 400px; width: 100%; min-height: 500px;'></iframe>
    </div>
     <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    <script>
               // We are using a customized store to add hooks to connect event
        const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
          if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
            // When we receive DIRECT_LINE/CONNECT_FULFILLED action, we will send an event activity using WEB_CHAT/SEND_EVENT
            dispatch({
              type: 'WEB_CHAT/SEND_EVENT',
              payload: {
                name: 'webchat/join',
                value: { language: window.navigator.language }
              }
            });
          }
          return next(action);
        });
        
        const styleOptions = {
            botAvatarImage: '<<Given Image URL, removed as these are project specific>>',
            botAvatarInitials: 'BF',
            userAvatarImage: '<<Given Image URL, removed as these are project specific>>',
            userAvatarInitials: 'WC',
            bubbleBackground: 'rgba(0, 0, 255, .1)',
            bubbleFromUserBackground: 'rgba(0, 255, 0, .1)'
        };
        window.WebChat.renderWebChat({
            directLine: window.WebChat.createDirectLine({ secret: '<<given my code here as it is secret i have attached this removing the code>>' }),

            // Passing "styleOptions" when rendering Web Chat
            styleOptions
        }, document.getElementById('webchat'));
    </script>
</body>
</html>

У меня есть чат-бот, созданный в C # с использованием SDK 4, и я пытаюсь отобразить текст приветствия, когда пользователь открывает веб-чат в браузере.В настоящее время текст приветствия отображается в эмуляторе, а не в открытом браузере WebchatBot после публикации в Azure.Это только показывает приветственное сообщение только после того, как я наберу что-то вроде «Привет» или что-то еще.Это не должно быть так, что сначала должен отображаться текст приветствия, а затем я могу напечатать Привет или что-нибудь еще, чтобы продолжить разговор

Проблема: приветственное сообщение отображается в эмуляторе, но не в боте веб-чата после публикации, отображается только после вводачто-нибудь?Должно появиться приветственное сообщение, как только вы откроете Webchatbot в браузере.

Язык: C #

Bot SDK: V4

Пакеты Bot Builder: все обновления до 4.4.3 через Nuget

Bot Emulator: последние версии 4.4.1, загруженные и установленные из выпусков GitHub

Текст приветствия вызывается в действии ConversationUpdate внутри метода OnTurnSync класса IBOT.Код, указанный ниже для справки.

Пожалуйста, помогите, поскольку я новичок в BOT и кодировании, предоставляя пошаговые инструкции?

Я уже пробовал несколько вещей, таких как:

  1. Отладка в эмуляторе, но это не сильно помогло

Ниже код, который я использовал:

public const string WelcomeText = "Welcome!. This bot uses a custom dialog that executes a data driven flow.  Type anything to get started.";

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{            
    if (turnContext.Activity.Type == ActivityTypes.ConversationUpdate)
    {
        if (turnContext.Activity.MembersAdded != null)
        {
            await SendWelcomeMessageAsync(turnContext, cancellationToken);
        }
    }
}

private static async Task SendWelcomeMessageAsync(ITurnContext turnContext, CancellationToken cancellationToken)
{
    foreach (var member in turnContext.Activity.MembersAdded)
    {
        if (member.Id != turnContext.Activity.Recipient.Id)
        {
            var reply = turnContext.Activity.CreateReply();
            reply.Text = WelcomeText;
            await turnContext.SendActivityAsync(reply, cancellationToken);
        }
    }
}

Ожидаемый результат: текст приветствия должен отображаться в WebchatBot также после публикации не только вЭмулятор.
Фактический результат: текст приветствия работает только в эмуляторе, но не в веб-чате, он отображается только после ввода текста.

1 Ответ

4 голосов
/ 13 мая 2019

Это распространенный вопрос, касающийся приветствия пользователей.

События, создаваемые каналами, не одинаковы для каждого канала: одно из основных различий между событиями в Webchat и Emulator заключается в том, что:

  • В эмуляторе 2 ConversationUpdate событий отправляются в начале диалога (1 добавлен бот, 1 добавлен пользователь)
  • В чате,ConversationUpdate о пользователе отправляется только после того, как пользователь отправил 1 сообщение

Таким образом, чтобы обойти это поведение, вы можете обрабатывать на своей стороне event, используя механизм, называемый backchannel,Вот пример для этого варианта использования в репозитории Github здесь

В нескольких словах вы должны:

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