BotBuilder-Samples отсутствуют серверы токенов, необходимые для образцов BotFramework-WebChat? - PullRequest
1 голос
/ 23 сентября 2019

ШАГ 1: Я клонировал ОБРАЗЕЦ BotEramework CORE BOT: https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/13.core-bot

ШАГ 2: Я клонировал ОБРАЗЕЦ ВЕБ-ЧАТА BotFramework 'Настройте веб-чат, сделав компонент минимизируемым' https://github.com/microsoft/BotFramework-WebChat/tree/master/samples/12.customization-minimizable-web-chat

ШАГ 3: Теперь я хочу соединить образец веб-чата с образцом Core Bot, что в основном означает, что я помещаю URL своего бота в следующую строку кода в файле веб-чата MinimizableWebChat.js: const res = await fetch('https://my_own_bot.azurewebsites.net/directline/token', {method:' POST '});

Но шаг 3 не работает.Веб-чат не подключается к моему боту.Похоже, что в образце Core Bot не реализован токен-сервер, поэтому образец веб-чата и образец основного бота не могут подключиться.Правильно ли это толкование?Если да, не могли бы вы помочь мне, как добавить токен-сервер в пример Core Bot в C #?

PS: Неужели в образце Core Bot отсутствует токен-сервер?Образец называется CORE BOT, и я думаю, каждому боту нужен токен-сервер?!

Большое спасибо!

1 Ответ

2 голосов
/ 23 сентября 2019

Неужели в образце Core Bot отсутствует токен-сервер?Образец называется CORE BOT, и я думаю, каждому боту нужен токен-сервер?!

Нет, не совсем.Если вы создаете свой собственный клиент веб-чата, как в примерах веб-чатов, вы можете иметь сервер токенов для обмена секретом на токен.Но если вы не создаете свой собственный веб-чат, или вам не нужно обменивать секрет токеном или вы хотите использовать буквально любой другой канал, он вам не нужен.

сказал, у меня есть рабочий секрет-> токен обмена в C # здесь .Как и в случае версий узлов в репозитории веб-чатов.Это изменения, которые я сделал, чтобы перевести этот пример из узла в C #:

в моем html-файле:

<body>
    <h2>Index??</h2>
    <div id="webchat" role="main" />
    <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    <script>
        (async function () {
            const res = await fetch('/directline/token', { method: 'POST' });
            const { token } = await res.json();
            window.WebChat.renderWebChat({
                directLine: window.WebChat.createDirectLine({ token }),
            }, document.getElementById('webchat'));
        })();
    </script>
</body>

Чтобы перехватить этот запрос POST, мне пришлось добавить пару вещей вбот.В классе запуска мне нужно было убедиться, что моя модель токена была видна:

services.Configure<DLSModel>(Configuration.GetSection("DirectLine"));

Затем я добавил DSLModel в мои модели

image of mvc model folder structure

Сама модель довольно проста:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace JJDirectLineBot.Models
{
    public class DLSModel
    {
        public string DirectLineSecret { get; set; }
    }
}

По сути, все, что говорит "искать ее прямой секрет в настройках своего приложения".Я уверен, что есть более простой способ добраться туда, но это тот, который я сделал.

Затем вам нужен контроллер, чтобы фактически сделать запрос:

namespace JJDirectLineBot.Controllers
{

    public class TokenController : ControllerBase
    {
        private readonly IOptions<DLSModel> dlSecret;

        public TokenController(IOptions<DLSModel> dls)
        {
            dlSecret = dls;
        }

        [Route("/directline/token")]
        [HttpPost]
        public async Task<string> TokenRequest()
        {
            var secret = dlSecret.Value.DirectLineSecret;
            HttpClient client = new HttpClient();
            HttpRequestMessage request = new HttpRequestMessage(
                HttpMethod.Post,
                $"https://directline.botframework.com/v3/directline/tokens/generate");
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", secret);
            var userId = $"dl_{Guid.NewGuid()}";
            request.Content = new StringContent(
                JsonConvert.SerializeObject(
                    new { User = new { Id = userId } }),
                Encoding.UTF8,
                "application/json");
            var response = await client.SendAsync(request);
            string token = string.Empty;

            if (response.IsSuccessStatusCode)
            {
                var body = await response.Content.ReadAsStringAsync();

                return body;
            }
            else
            {
                //Error();
                return token;
            }

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