【问题标题】:How can I host the .Net Bot application On- premises如何在本地托管 .Net Bot 应用程序
【发布时间】:2017-07-10 13:09:11
【问题描述】:

我们有一个客户端要求,即 Bot 应用程序应托管在本地,并且所有网络聊天通信都直接进入网络服务器。我计划开发一个 Bot .Net 应用程序并使用网络聊天频道进行配置。我想知道是否可以在本地配置 Bot 应用程序

  1. 如何在本地设置网络聊天?
  2. 如何跳过机器人注册并避免消息路由?
  3. 我是否必须构建一个服务来处理 Web 服务器中的所有请求和响应?
  4. 如果我使用网络聊天,客户端数据如何安全以及机器人服务如何将请求路由到 Webapp?

如果我使用网络聊天,客户端数据的安全性以及机器人服务如何将请求路由到 Webapp。

【问题讨论】:

    标签: c# bots botframework


    【解决方案1】:

    好的。因此,让我们分解问题。
    您想要做的是将您的机器人与它与 Microsoft Bot 连接器/框架的任何和所有通信隔离开来。

    首先了解 Microsoft Bot Framework 生态系统中涉及哪些组件。

    了解 Bot Framework 生态系统

    一个普通的机器人通常会与 3 个 Microsoft 服务交互 -

    • Microsoft Bot Connector:这个人是 Bot Framework 的核心。它具有消息路由、会话跟踪和通道适应的关键工作(除了其他不重要的事情(安全性!))。
    • Microsoft Bot State Service:该服务用于存储对话(和自定义)状态。
    • Microsoft Account (MSA) server:Bot 连接器服务使用 OAuth 2.0 客户端凭据进行机器人身份验证。 MSA 服务器颁发这些 JWT 访问令牌。

    现在要创建本地机器人,您需要替换/模拟上述所有组件。幸运的是,Bot Builder SDK 是开源的并且设计良好。与上述服务交互的实现是接口驱动的,易于更改。

    了解和修改 Bot Builder SDK 以创建本地 Bot

    由于我们的目标是不使用任何 Microsoft 服务,因此我们不需要 MSA 服务器来生成令牌。所以不需要机器人注册。

    最容易替换的服务是Bot State Service。您需要做的就是实现IBotDataStoreIBotState 接口。因此,例如,您可以将状态存储到您自己的 Redis 数据库中,而不是将状态存储在 Bot 状态服务中。我写了一个blog post 来说明如何做到这一点。

    现在剩下的就是替换 Bot Connector。这很棘手,而且不是直截了当的。另外,它不是开源的,所以你自己在这里。如上所述,第一个重要的部分是频道适配。由于您提到您只需要网络聊天频道,因此没有太多可适应的(呃?!)。它所做的第二件事是会话跟踪,它依赖于专门生成的不同 ID 会话 ID 和活动 ID。你必须understand 他们代表什么。会话 ID 通常由频道创建和修改。

    您必须在此处选择如何创建对话 ID。默认情况下,网络聊天具有临时对话 ID。您可以选择使其更永久(一种方法是要求用户登录并使用用户 ID)。

    消息路由在网络聊天频道中的工作方式不同,因为 Bot 连接器没有一个特定的端点必须调用(如 Facebook Graph API)。因此网络聊天频道使用Direct Line APIs 发送消息并轮询(或使用套接字)特定端点来接收消息。网络聊天频道是open source,继续看看他们是如何做到的。

    因此,要完全替换 Bot Connector API,您需要创建自己的 connector 服务

    • 接受来自网络聊天频道的请求。
    • 调整它并将请求转发给机器人
    • 接受来自 bot 的响应(我们将了解如何执行此操作)
    • 在某些持久存储中维护响应。需要,因为用户可能已经关闭了网页,所以您可能需要在他回来时交付它。
    • 在下一次投票(或使用套接字)时将响应返回到网络聊天频道。

    诚然,这并非微不足道,但您可以做出一些设计决策,让生活更轻松一些。例如取消 adapter 并保持单一模式用于从网络聊天控件到机器人并返回(但随后您将需要更改网络聊天频道代码)。对于初学者,您甚至可以查看BotFramework Emulator code,它模拟 Direct Line API。

    现在如何让您的机器人向您自己的connector 服务发送回复?为此,您需要实现IBotToUser 接口。这很容易做到。看看我的repo,我将响应返回给 Skype For Business 客户端而不是 Bot 连接器。


    这就是我相信的。如果你能完成上述工作,你就可以拥有一个完全隔离的机器人,而无需连接到云。为了安全起见,您可能有自己的 OAuth 提供者(我推荐 IdentityServer)或在使用机器人之前让用户登录。除非我对您的应用生态系统和用例有更多了解,否则我无法回答安全细节。

    对话数据(和状态)可以很容易地存储在您的本地数据库中。在我看来,如果您可以继续使用 Bot Connector 并仅替换 Bot 状态服务,那将是最好的(您还可以继续从 Bot Framework 接收新功能,而无需更改任何代码)。


    以上所有信息均来自我自己使用 Bot Framework 的经验。如果有人有更好的建议,请随时分享,我会进行修改。

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多