【问题标题】:Azure Web Chat Bot Token ServerAzure 网络聊天机器人令牌服务器
【发布时间】:2020-01-17 07:22:00
【问题描述】:

问题:

我正在努力了解如何获得令牌。我知道我为什么要使用它们,但我只是不明白如何获得它们。所有使用令牌的样本都只是从“https://webchat-mockbot.azurewebsites.net/directline/token”或类似的东西中获取它们。如何在我的机器人中创建此路径?

描述您考虑过的替代方案

我能够创建一些适用于我的 JS-Bot 的东西:

    const server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function() {
    console.log(`\n${ server.name } listening to ${ server.url }`);
    console.log('\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator');
    console.log('\nTo talk to your bot, open the emulator select "Open Bot"');
});

server.post('/token-generate', async (_, res) => {
  console.log('requesting token ');
  try {
    const cres = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', {
      headers: { 
        authorization: `Bearer ${ process.env.DIRECT_LINE_SECRET }`
      },
      method: 'POST'
    });

    const json = await cres.json();


    if ('error' in json) {
      res.send(500);
    } else {
      res.send(json);
    }
  } catch (err) {
    res.send(500);
  }
});

但我不知道如何使用我的 C#-Bot 来执行此操作(我切换到 C#,因为我比 JS 更了解它)。

在我的 C#-Bot 中只有这个:

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Integration.AspNet.Core;

namespace ComplianceBot.Controllers
{
    // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot
    // implementation at runtime. Multiple different IBot implementations running at different endpoints can be
    // achieved by specifying a more specific type for the bot constructor argument.
    [Route("api/messages")]
    [ApiController]
    public class BotController : ControllerBase
    {
        private readonly IBotFrameworkHttpAdapter _adapter;
        private readonly IBot _bot;

        public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)
        {
            _adapter = adapter;
            _bot = bot;
        }

        [HttpGet, HttpPost]
        public async Task PostAsync()
        {
            // Delegate the processing of the HTTP POST to the adapter.
            // The adapter will invoke the bot.
            await _adapter.ProcessAsync(Request, Response, _bot);
        }
    }
}

我可以在这里添加一条新路线吗?像 [Route("directline/token")] ?

我知道我可以用一个额外的“令牌服务器”来做到这一点(我不知道如何实现它,但我知道这会起作用),但如果可能的话,我想用我已经存在的c#-bot 就像我用我的 JS-Bot 做的那样。

【问题讨论】:

    标签: c# azure token chatbot


    【解决方案1】:

    我已经发布了一个答案,其中包括如何实现 API 以在 C# bot 中获取直接线路访问令牌以及如何获取此令牌,just refer to here。如果您还有其他问题,请随时告诉我。

    更新:

    我的代码基于 this demo 。如果您使用的是.net core,请在/Controllers 文件夹下创建一个TokenController.cs:

    TokenController.cs的代码:

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Newtonsoft.Json;
    
    namespace Microsoft.BotBuilderSamples.Controllers
    {
    
        [Route("api/token")]
        [ApiController]
        public class TokenController : ControllerBase
        {
    
    
            [HttpGet]
            public async Task<ObjectResult> getToken()
            {
                var secret = "<direct line secret here>";
    
                HttpClient client = new HttpClient();
    
                HttpRequestMessage request = new HttpRequestMessage(
                    HttpMethod.Post,
                    $"https://directline.botframework.com/v3/directline/tokens/generate");
    
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secret);
    
                var userId = $"dl_{Guid.NewGuid()}";
    
                request.Content = new StringContent(
                    Newtonsoft.Json.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();
                    token = JsonConvert.DeserializeObject<DirectLineToken>(body).token;
                }
    
                var config = new ChatConfig()
                {
                    token = token,
                    userId = userId
                };
    
                return Ok(config);
            }
        }
        public class DirectLineToken
        {
            public string conversationId { get; set; }
            public string token { get; set; }
            public int expires_in { get; set; }
        }
        public class ChatConfig
        {
            public string token { get; set; }
            public string userId { get; set; }
        }
    }
    

    将 secret 替换为您自己的直接线路密码后运行项目。您将能够通过 url:http://localhost:3978/api/token 在本地获取令牌:

    【讨论】:

    • 正是我正在寻找的。没有找到它,因为原始问题不同。非常感谢!
    • 这段代码似乎不再工作了。我收到一些错误:VS Code 不理解“ApiController”和“IHttpActionResult”,但我只是复制粘贴了您的代码
    • 嗨@BeschtPlaier 我正在使用VS进行编码。似乎您正在使用.net core。但这个演示是由 .net fremework 编码的。你还在面对这个问题吗?如果您仍在努力,请告诉我,我将通过 .net core 为您制作一个演示。
    • 是的,我仍在努力。那真的很棒!我真的需要这个才能工作,但我自己无法弄清楚,因为我是一个 c# 初学者:(
    • 嗨@BeschtPlaier,我已经更新了我的答案,请试一试
    猜你喜欢
    • 2020-03-31
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多