我们如何为Microsoft Bot Framework中的不同用户维护不同的会话?

时间:2017-09-13 06:46:37

标签: node.js botframework direct-line-botframework

我使用 Bot框架创建了一个机器人,并且想知道在使用 directline 时是否有任何方法可以为不同的用户维护不同的会话。
在使用skype频道时,为个人用户维护用户会话,我希望在我的直线客户端中实现相同的功能。
在我的情况下,前一个会话数据被下一个会话数据覆盖。
我正在使用 Node.js 来构建机器人。

2 个答案:

答案 0 :(得分:1)

您需要为每个用户开始一个新对话。

假设您的工作基于Direct Line (WebSockets)示例(我使用的是Swagger-JS v2)。

如果您使用您的机密生成令牌并将该令牌附加到将开始对话的客户端,请执行以下操作:

// Obtain a token using the Direct Line secret
return rp({
    url: 'https://directline.botframework.com/v3/directline/tokens/generate',
    method: 'POST',
    headers: {
        'Authorization': 'Bearer ' + directLineSecret
    },
    json: true
}).then(function (response) {
    // Then, replace the client's auth secret with the new token
    var token = response.token;
    client.clientAuthorizations.add('AuthorizationBotConnector', new Swagger.ApiKeyAuthorization('Authorization', 'Bearer ' + token, 'header'));
    return client;
});

此客户端只能启动一个会话。这就是你有覆盖对话问题的原因。

为了让客户启动多个对话。您需要将您的秘密放在客户端授权标头中,如下所示:

.then(function (client) {
    // No need to obtain a token using the Direct Line secret
    // Use the Direct Line secret directly
    client.clientAuthorizations.add('AuthorizationBotConnector', new Swagger.ApiKeyAuthorization('Authorization', 'Bearer ' + directLineSecret, 'header'));
    return client;
})

使用此方法,每次使用此方法开始新对话时:

client.Conversations.Conversations_StartConversation();

将为每个对话生成一个令牌,您可以为每个用户进行对话。当然,您需要在应用的用户ID和Direct Line的会话ID之间添加映射。

答案 1 :(得分:0)

假设您已经知道用户是谁并拥有userId,需要手动或通过OAuth从用户提供。您需要这样做,因为在构造对话数据时,它被用作行条目的键的一部分。每个条目的ID是userId +':' + conversationId。您可以通过userId查询对话以检索conversationId。然后你可以在session对象中设置conversationId。