BotBuilder示例缺少BotFramework WebChat示例所需的令牌服务器?

BotBuilder示例缺少BotFramework WebChat示例所需的令牌服务器?,botframework,Botframework,步骤1: 我已经克隆了BotFramework核心BOT示例: 步骤2: 我已经克隆了BotFramework WEB聊天示例“通过使组件最小化来定制WEB聊天” 步骤3: 现在,我想将Web聊天示例与核心Bot示例连接起来,这基本上意味着我将我的Bot URL放入minimableWebChat.js Web聊天文件中的以下代码行中: const res=wait fetch(“”,{method:'POST'}) 但第三步不起作用。网络聊天未连接到我的机器人。Core Bot示例似乎没有实现

步骤1: 我已经克隆了BotFramework核心BOT示例:

步骤2: 我已经克隆了BotFramework WEB聊天示例“通过使组件最小化来定制WEB聊天”

步骤3: 现在,我想将Web聊天示例与核心Bot示例连接起来,这基本上意味着我将我的Bot URL放入minimableWebChat.js Web聊天文件中的以下代码行中: const res=wait fetch(“”,{method:'POST'})

但第三步不起作用。网络聊天未连接到我的机器人。Core Bot示例似乎没有实现令牌服务器,因此web聊天示例和Core Bot示例无法连接。这个解释正确吗?如果是,请您帮助我如何将令牌服务器添加到C#中的Core Bot示例中

PS:核心Bot示例是否真的缺少令牌服务器?这个例子叫做核心机器人,我想每个机器人都需要一个令牌服务器

非常感谢

核心Bot示例是否真的缺少令牌服务器?这个例子叫做核心机器人,我想每个机器人都需要一个令牌服务器

不,不是真的。如果您正在构建自己的webchat客户端,如webchat示例中所示,那么您可以使用令牌服务器将密钥交换为令牌。但是,如果你不想建立自己的webchat,或者你不想用一个秘密交换一个令牌,或者你想使用任何其他渠道,你不需要

话虽如此,我在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>

基本上,所有这些都是说‘在她的应用程序设置中查找她的directline机密’。我相信有一种更简单的方法可以实现这一点,但我就是这么做的

然后,您需要一个控制器来实际发出请求:

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;
            }

        }
    }
}
名称空间JJDirectLineBot.Controllers
{
公共类令牌控制器:ControllerBase
{
私有只读密码;
公共令牌控制器(IOPS dls)
{
dlSecret=dls;
}
[路由(“/directline/token”)]
[HttpPost]
公共异步任务令牌请求()
{
var secret=dlSecret.Value.DirectLineSecret;
HttpClient=新的HttpClient();
HttpRequestMessage请求=新建HttpRequestMessage(
HttpMethod.Post,
$"https://directline.botframework.com/v3/directline/tokens/generate");
request.Headers.Authorization=new System.Net.Http.Headers.AuthenticationHeaderValue(“承载者”,机密);
var userId=$“dl_{Guid.NewGuid()}”;
request.Content=新的StringContent(
JsonConvert.SerializeObject(
新{User=new{Id=userId}}),
Encoding.UTF8,
“应用程序/json”);
var response=wait client.sendaync(请求);
string-token=string.Empty;
if(响应。IsSuccessStatusCode)
{
var body=await response.Content.ReadAsStringAsync();
返回体;
}
其他的
{
//错误();
返回令牌;
}
}
}
}

太好了,非常感谢这篇非常有用和全面的解释和代码片段!!!如果我的答案有助于解决您的问题,请选择它作为答案,以便将来的用户可以看到。
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;
            }

        }
    }
}