botframework - BotBuilder-Samples 缺少 BotFramework-WebChat 示例所需的令牌服务器?
问题描述
第 1 步:我已经克隆了 BotFramework CORE BOT 示例:https ://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/13.core-bot
第 2 步:我已经克隆了 BotFramework WEB CHAT SAMPLE 'Customize Web Chat by Making the Component Minimizable' https://github.com/microsoft/BotFramework-WebChat/tree/master/samples/12.customization-minimizable-web-chat
第 3 步:现在我想将 Web Chat 示例与 Core Bot 示例连接起来,这基本上意味着我将我的 bot URL 放入 MinimizableWebChat.js 网络聊天文件中的以下代码行中: const res = await fetch(' https: //my_own_bot.azurewebsites.net/directline/token ', { method: 'POST' });
但是第 3 步不起作用。网络聊天没有连接到我的机器人。Core Bot 示例似乎没有实现令牌服务器,因此网络聊天示例和核心 bot 示例无法连接。这种解释正确吗?如果是,您能帮我如何在 C# 中将令牌服务器添加到 Core Bot 示例吗?
PS:Core Bot 样本真的缺少令牌服务器吗?该示例称为 CORE BOT,我猜每个机器人都需要一个令牌服务器?!
非常感谢!
解决方案
Core Bot 样本真的缺少令牌服务器吗?该示例称为 CORE BOT,我猜每个机器人都需要一个令牌服务器?!
不,不是。如果您正在构建自己的网络聊天客户端,就像在网络聊天示例中一样,您可以拥有一个令牌服务器来交换令牌的秘密。但是,如果您不建立自己的网络聊天,或者您不关心用秘密交换令牌,或者您想使用任何其他渠道,您就不需要一个。
话虽如此,我在这里有一个 C# 中的秘密->令牌交换。就像 webchat repo 中的节点版本一样。这些是我为将该示例从节点转换为 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 添加到我的模型中
模型本身非常简单:
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;
}
}
}
}
推荐阅读
- firebase - 在内部托管 Firebase 实时数据库
- jenkins - Jenkins xcode 插件错误地报告没有配置开发人员配置文件
- ajax - Datatables Ajax 无法渲染 Vue 组件
- php - Stripe Checkout Link onClick 不处理付款
- date - ionic 3 dateTime - displayFormat="HH:mm [Uhr]" 将 Uhr 中的 h 转换为时间,如何忽略它?
- c++ - 如果索引不是整数,我们如何在 C++ 中插入哈希表
- sql-server - SQL 按列分组
- continuous-deployment - KeyVault ARM 模板在重新部署时会覆盖机密
- json - 为什么 JSON 路径对 WSO2 ESB 5.0 的 JSON 请求无效
- vba - VBA 中的 SABR 模型隐含波动率