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

max*_*max 3 c# bots botframework

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

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

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

Ank*_*nha 9

好.所以让我们分解问题吧.
您要做的是将您的bot与其与Microsoft Bot Connector/Framework的任何和所有通信隔离开来.

首先要了解Microsoft Bot Framework Ecosystem中涉及的组件.

了解Bot框架生态系统

通常,vanilla bot会与3个Microsoft服务进行交互 -

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

现在要创建一个内部部署机器人,您需要替换/模拟所有上述组件.幸运的是,Bot Builder SDK是开源的,设计精良.与上述服务交互的实现是界面驱动的并且易于改变.

了解和修改Bot Builder SDK以创建内部部署机器人

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

最容易取代的服务是Bot State Service.您需要做的就是实现IBotDataStoreIBotState接口.因此,您可以将其存储到您自己的Redis数据库中,而不是将状态存储在Bot State Service中.我写了一篇关于如何做到这一点的博客文章.

现在还剩下什么来取代Bot Connector.这很棘手而且不直接.此外,它不是开源的,所以你在这里独自一人.如上所述,第一个重要的部分是频道适应.既然你提到你只需要网络聊天频道,那就没什么可适应的了(呃?!).它做的第二件重要事情是会话跟踪,它依赖于专门生成的不同ID,对话ID和活动ID.你必须明白它们代表什么.会话ID通常由Channel创建和修改.

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

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

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

  • 接受来自网络聊天频道的请求.
  • 调整它并将请求转发给bot
  • 接受来自bot的响应(我们将了解如何执行此操作)
  • 在某些持久性商店中维护响应.需要,因为用户可能已关闭网页,因此您可能需要在他回来时提供它.
  • 在下次轮询(或使用套接字)时将响应返回到Web聊天频道.

虽然这不是微不足道的,但你可以做一些可以让生活变得更轻松的设计决定.例如,取消适配器并保持单个架构,以便从Web聊天控制到机器人和后台进行通信(但随后您将需要更改Web Chat Channel代码).对于初学者来说,你甚至可以看BotFramework仿真器的代码,其模拟的直线API.

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


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

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


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