首页 > 解决方案 > 如何在使用 C# MS BOT 框架 SDK V4 的瀑布对话框创建的网络聊天 BOT 中添加状态管理?

问题描述

我使用 C# SDK V4 创建了聊天机器人,它有多个瀑布对话框类,每个类都用于在选择某个选项时执行特定操作。BOT 还使用 Oauth Prompt 嵌入了身份验证。

频道:网络频道

开发工具包:SDKV4

语言:C#

现在,我希望在瀑布对话框中处理或保留状态管理,因为我看到的示例位于普通回声机器人之上,如果我在现有的具有瀑布对话框的机器人上实现相同的行,则它不起作用。

明白为什么我想要状态管理作为在使用 Oauth Prompt 对用户进行身份验证后,我正在根据登录的用户显示选项现在 2 个或多个用户同时登录或一个接一个地登录,另一个登录正在被占用,第二个数据当第一个用户在显示的选项中来回切换时,登录用户会显示给他。

当我记录一个关于如何维护登录用户或刷新登录用户的查询时,我被建议使用状态管理技术,因此这个查询是关于如何在全水对话框中进行的。

如果状态管理不是正确的选项,那么您能否告诉我如何刷新或维护登录的用户 ID?

标签: c#botframeworkchatbot

解决方案


这怀疑问题与您在启动网络聊天时传递给 Direct Line 的道具有关。在Integrate with Javascript下引用,文档状态:

不建议将 userID 分配为静态值,因为这将导致所有用户共享状态。有关详细信息,请参阅 API 用户 ID 条目。

当您调用生成令牌时,此时应传递用户 ID(对用户来说应该是唯一的),否则您将遇到共享状态的问题。

这是我为访问获取并返回直接行令牌的本地 API 而运行的一些代码。如您所见,用户 ID 在请求中传递,然后在返回时将其烘焙到令牌中。

// Listen for incoming requests.
server.post('/directline/token', (req, res) => {
    // userId must start with `dl_`
    const userId = (req.body && req.body.id) ? req.body.id : `dl_${ Date.now() + Math.random().toString(36) }`;
    const options = {
        method: 'POST',
        uri: 'https://directline.botframework.com/v3/directline/tokens/generate',
        headers: {
            Authorization: `Bearer ${ process.env.directLineSecret }`,
            'Access-Control-Allow-Origin': '*'
        },
        json: {
            user: {
                ID: userId
            }
        }
    };
    request.post(options, (error, response, body) => {
        if (!error && response.statusCode < 300) {
            res.send(body);
            console.log('Someone requested a token...');
        } else if (response.statusCode >= 400 && response.statusCode < 500) {
            res.send(response.statusCode);
        } else if (response.statusCode >= 500) {
            res.status(response.statusCode);
            res.send('Call to retrieve token from DirectLine failed');
        }
    });
});

希望有帮助!


推荐阅读