如何在本地托管 .Net Bot 应用程序

2024-01-10

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

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

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


好的。那么让我们来分解一下这个问题。
您想要做的是将您的机器人与它与 Microsoft Bot 连接器/框架的所有通信隔离。

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

了解 Bot 框架生态系统

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

  • 微软机器人连接器 https://docs.botframework.com/en-us/restapi/connector/#navtitle:这个人是 Bot Framework 的核心。它具有消息路由、会话跟踪和通道适配的关键工作(除了其他不重要的事情(安全性!))。
  • Microsoft Bot 状态服务 https://docs.botframework.com/en-us/core-concepts/userdata/#navtitle:此服务用于存储对话(和自定义)状态。
  • Microsoft 帐户 (MSA) 服务器 https://docs.botframework.com/en-us/core-concepts/authentication/#navtitle:Bot Connector 服务使用 OAuth 2.0 客户端凭据进行机器人身份验证。 MSA 服务器颁发这些 JWT 访问令牌。

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

了解并修改 Bot Builder SDK 以创建本地机器人

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

最容易替换的服务是机器人状态服务。您所需要做的就是实施IBotDataStore or IBotState界面。因此,您可以将状态存储到您自己的 Redis 数据库中,而不是将状态存储在 Bot State Service 中。我写了一个博客文章 https://ankitbko.github.io/2016/10/Microsoft-Bot-Framework-Use-Redis-to-store-conversation-state/关于如何做到这一点。

剩下的现在要替换机器人连接器。这很棘手,而且并不简单。另外,它不是开源的,所以你只能靠自己了。如上所述,第一个重要部分是通道适应。由于您提到您只需要网络聊天频道,因此没有太多需要适应的地方(废话?!)。它做的第二件重要的事情是会话跟踪,它依赖于专门生成的不同 ID(会话 ID 和活动 ID)。你必须理解 https://docs.botframework.com/en-us/bot-framework-guide-id/#navtitle他们代表什么。会话ID通常由Channel创建和修改。

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

消息路由在 Web 聊天通道中的工作方式有所不同,因为 Bot Connector 不需要调用任何特定端点(如 Facebook Graph API)。因此,网络聊天渠道可以利用直线 API https://docs.botframework.com/en-us/restapi/directline3/#navtitle发送消息并轮询(或使用套接字)特定端点以接收消息。网络聊天频道是开源 https://github.com/Microsoft/BotFramework-WebChat,继续看看他们是如何做到的。

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

  • 接受来自网络聊天渠道的请求。
  • 对其进行调整并将请求转发给机器人
  • 接受机器人的响应(我们将了解如何执行此操作)
  • 在某个持久存储中维护响应。需要,因为用户可能已经关闭了网页,所以当他回来时你可能需要传递它。
  • 在下一次轮询时将响应返回到网络聊天通道(或使用套接字)。

当然,这并不是一件小事,但您可以做出一些设计决策,让生活变得更轻松一些。比如废除adapter并保留从 Web 聊天控件到机器人并返回的通信的单一架构(但随后您将需要更改 Web 聊天通道代码)。对于初学者,你甚至可以看看BotFramework模拟器代码 https://github.com/Microsoft/BotFramework-Emulator which 模拟直线 API。

现在如何让您的机器人向您自己的机器人发送回复连接器服务?为此,您需要实施IBotToUser界面。这很容易做到。看看我的repo https://github.com/ankitbko/SkypeForBusinessBot我将响应返回给 Skype For Business 客户端而不是 Bot Connector。


这就是我所相信的。如果您能完成上述操作,您就可以拥有一个完全隔离的机器人,无需与云建立连接。为了安全起见,您可能有自己的 OAuth 提供商(我推荐身份服务器 https://github.com/IdentityServer/IdentityServer4)或在使用机器人之前让用户登录。除非我对您的应用程序生态系统和用例有更多了解,否则我无法回答安全细节。

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在本地托管 .Net Bot 应用程序 的相关文章

随机推荐