Teams Bot开发系列:Activity处理流程

上篇文章介绍了什么是Activity,Turn,TurnContext和BotAdapter,这篇文章我们看看这些东西是如何窜起来的,他们是如何处理用户发给bot的消息的。

我们以一个最简单的bot,echo bot为例子,所谓的echo bot就是用户发什么消息,它就照样回复一条消息。为了简单起见,大家可以先安装VS2019的一个扩展插件BotBuilderVSIX.vsix template,然后创建一个NET core 3.1的Echo bot。

 

可以看到这个模板为什么创建了一个项目,我们先到Startup.cs看一下:

// Create the Bot Framework Adapter with error handling enabled.
services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();// Create the bot as a transient. In this case the ASP Controller is expecting an IBot.
services.AddTransient<IBot, EchoBot>();

可以看到DI了两个类,值得注意的是,AdapterWithErrorHandler使用的是Singleton,而EchoBot使用的是Transient,如果大家不同模板来生成的话,这两个千万不能写错,不然会出意想不到的错误,而且非常难查。

打开AdapterWithErrorHandler.cs文件,可以看到它从BotFrameworkHttpAdapter继承下来。主要是提供了一些针对异常错误的处理

public class AdapterWithErrorHandler : BotFrameworkHttpAdapter
{public AdapterWithErrorHandler(IConfiguration configuration, ILogger<BotFrameworkHttpAdapter> logger): base(configuration, logger){OnTurnError = async (turnContext, exception) =>{...};}
}

从bot sdk的源代码里,我可以知道 BotFrameworkHttpAdapter 一层层往上,最终到达 BotAdapter

public class BotFrameworkHttpAdapter : BotFrameworkHttpAdapterBase, IBotFrameworkHttpAdapter
{...
}public class BotFrameworkHttpAdapterBase : BotFrameworkAdapter, IStreamingActivityProcessor
{...
}public class BotFrameworkAdapter : BotAdapter, IAdapterIntegration, IExtendedUserTokenProvider, IConnectorClientBuilder
{...
}public abstract class BotAdapter
{...
}

现在,我们结合下面这张图来理解整个的处理过程。

 

  1. 可以看到,当用户发了一条文字消息 “Hi”,这个消息被发到我们bot服务的时候,我们调用Adapter的ProcessActivity方法。我们在BotController.cs可以看到这个。
[Route("api/messages")]
public class BotController : ControllerBase
{private readonly IBotFrameworkHttpAdapter Adapter;private readonly IBot Bot;public BotController(IBotFrameworkHttpAdapter adapter, IBot bot){Adapter = adapter;Bot = bot;}[HttpPost, HttpGet]public async Task PostAsync(){await Adapter.ProcessAsync(Request, Response, Bot);}
}
  1. Adapter创建TurnContext后,调用bot上的OnTurn方法,但是生成的Echo bot里并看不到OnTurn方法,我们先看一下EchoBot.cs
public class EchoBot : ActivityHandler
{protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken){var replyText = $"Echo: {turnContext.Activity.Text}";await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);}
}

可以看到我们的EchoBot从ActivityHandler继承下来,我们查看一下SDK的源代码,可以发现:

public class ActivityHandler : IBot
{public virtual async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)){switch (turnContext.Activity.Type){case ActivityTypes.Message:await OnMessageActivityAsync(new DelegatingTurnContext<IMessageActivity>(turnContext), cancellationToken).ConfigureAwait(false);break;...}}protected virtual Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken){return Task.CompletedTask;}...
}

从上面sdk的源代码就可以发现adapter调用了EchoBot的父类ActivityHandlerOnTurnAsync()方法,后者根据Activity的Type来调用到了EchoBotOnMessageActivityAsync

  1. 当我们在EchoBot里调用SendActivityAsync()回复一条消息,会由Adapter来调用Azure Bot Service。

大家可以在 微软botbuilder-dotnet repo 里找到上面的源代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下搭建go环境--问题记录

记录自己在linux上搭建go环境的经历。&#xff08;因为各种版本&#xff0c;linux系统问题挣扎了几天&#xff09; 安装vmware-tools,把我要运行代码拷进来。这个网上方法很多&#xff0c;我的电脑抽风不能安装&#xff0c;后面重装的虚拟机确定Ubuntu版本、位数。很重要&#…

Teams Bot开发系列:Bot验证

我们今天来说一下authentication&#xff0c;authentication一直是一个复杂的问题。bot里的authentication也不简单。我们先来看一个概念&#xff1a;Bot Framework Token Service&#xff0c;根据官方定义&#xff0c;这个token service主要是&#xff1a; Facilitating the u…

堆排序

目录 一、定义二、算法分析三、代码地址一、定义 1.1 堆 ​ 此处的堆&#xff0c;指数据结构中的堆。而不是内存中的那种内存堆&#xff0c;内存堆是基于数据结构的一种实现。堆的数据结构是一棵完全二叉树&#xff0c;它有如下特点&#xff1a;&#xff08;具体参考下文链接&a…

Teams Bot开发系列:Middleware

middleware是目前一些framework比较流行的概念&#xff0c;通常一个开发框架需要提供一些可扩展可定制化的功能。所以middleware这种pattern就很实用。 熟悉asp.net core的开发可能第一个想到的就是asp.net core的middleware&#xff0c;如下图&#xff1a; 当一个http reques…

ElasticSearch教程——自定义分词器(转学习使用)

一、分词器 Elasticsearch中&#xff0c;内置了很多分词器&#xff08;analyzers&#xff09;&#xff0c;例如standard&#xff08;标准分词器&#xff09;、english&#xff08;英文分词&#xff09;和chinese&#xff08;中文分词&#xff09;&#xff0c;默认是standard. s…

使用Azure Serverless来开发Teams App

Azure Function可以说比较早期的一个serverless服务&#xff0c;随着这些年云服务的大行其道&#xff0c;Serverless在概念越来越火&#xff0c;什么叫serverless&#xff1f; Serverless computing (or serverless for short), is an execution model where the cloud provide…

使用AzureFunction开发最简单的Teams Outgoing Webhook

上篇文章讲了teams app的serverless架构&#xff0c;这篇主要讲如何真正使用Azure Function来开发一个最最简单的Teams Outgoing Webhook。 我们先登入azure的portal&#xff0c;创建一个azure function。我这里创建了一个名字叫outgoing-webhook的azure function。完成后如下…

Ubuntu宿主机与VMware中其他系统虚拟机的互通

Ubuntu做宿主机&#xff0c;VMware中创建Windows10&#xff0c;并且通过三种模式实现两系统互通&#xff0c;其实并非是件难事。在有线网卡未接网线的环境下&#xff0c;关闭两系统防火墙&#xff0c;基本遵从下文便可实现。 转载&#xff1a;https://note.youdao.com/ynotesha…

使用Azure轻松实现Teams App的全球合规性

我在之前的一篇博客里面讲了合规性对于我们Teams app是非常重要的&#xff0c;因为office365平台就是面向全世界用户的&#xff0c;我们开发的teams app一旦发布后&#xff0c;立刻就会有各国各地区的用户来进行安装使用&#xff0c;所以符合用户所在地区的要求是非常重要的。 …

ADC知识(2)——直流参数(输入电压参考,参考电流输入,积分非线性误差,差分非线性误差)...

目录 四、 输入参考电压范围 五、 参考电流 六、 非线性问题 差分非线性误差 积分非线性 四、 输入参考电压范围 大多数数据手册中&#xff0c;将它定义为一个特定的参考电压值&#xff0c;通常这个电压作为 此转换器最常用的参考电压。在参考输入电压…

LuckyDraw app使用CosmosDB的成本分析

我在以前的博客里说过我的LuckyDraw app在数据存储方面使用的是 Azure Table Storage&#xff0c;当时选择这个的原因是成本考虑&#xff0c;因为它实在是便宜&#xff0c;对于我这种个人开发维护的免费的teams app来说&#xff0c;成本是一个很重要的考量点。 当然&#xff0…

React 重温之 组件生命周期

生命周期 任何事物都不会凭空产生&#xff0c;也不会无故消亡。一个事物从产生到消亡经理的各个阶段&#xff0c;我们称之为 生命周期。 具体到我们的前端组件上来&#xff0c;一个组件的生命周期可以大体分为创建、更新、销毁这个三个阶段。 本文主要介绍React 的组件生命周期…

10 个优质的 Laravel 扩展推荐

这里有 10 个用来搭建 Laravel 应用的包 为何会创建这个包的列表&#xff1f;因为我是一个「比较懒」的开发者&#xff0c;在脸书上是多个 Laravel 小组的成员。平日遇到最多的问题就是开发是需要用那些包。我很懒所以我不想每次都从头开始搞这些东东。 为何此文没有包括管理包…

Java:反射+泛型:获取类型参数的实例

2019独角兽企业重金招聘Python工程师标准>>> 场景描述&#xff1a; 我需要开发四个页面&#xff0c;每个页面都是只涉及增删改查的基本逻辑。 最简单的写法&#xff1a; 创建四个接口A,B,C,D&#xff0c;每个接口中都声明了增删改查四个方法,完全一致 public Map<…

servlet(1)

servlet类分级&#xff1a; 1.ServletConfig接口类&#xff1a;理解为读取servlet配置的类&#xff0c;里面有四个抽象方法如下&#xff1a; ①getServletName:获取servlet在web.xml中的名字 ②getServletContext&#xff1a;获取Servlet上下文&#xff0c;相当于web项目管理所…

如何在 Apple Silicon (M1) 上开发 Teams App

apple 在几个月前发布了自家的芯片 M1&#xff0c;由于将多核cpu&#xff0c;多核gpu&#xff0c;神经网络运算&#xff0c;内存和其他一切处理部件高度整合在一起&#xff0c;大大提高数据传输速度。发布后好评如潮&#xff0c;我也没有忍住&#xff0c;入手了一台最低配的mac…

集成学习-Adaboost

Adaboost 中文名叫自适应提升算法&#xff0c;是一种boosting算法。 boosting算法的基本思想 对于一个复杂任务来说&#xff0c;单个专家的决策过于片面&#xff0c;需要集合多个专家的决策得到最终的决策&#xff0c;通俗讲就是三个臭皮匠顶个诸葛亮。 对于给定的数据集&#…

企业数据湖构建之旅

摘要&#xff1a;随着互联网的发展&#xff0c;数据的规模和类型都呈现一个爆炸性的增长&#xff0c;对于这么多类型的数据&#xff0c;如何进行有效的管理和存储&#xff0c;包括数据的分析&#xff0c;这是大家要面临的一个问题。在武汉云栖大会上&#xff0c;阿里云高级产品…

用AzureFunction开发最简单的Teams Bot

之前我有一篇文章讲了如何在azure function上开发最简单的outgoing webhook&#xff0c;收到一些反馈&#xff0c;建议我介绍一下如果在azure function上开发teams bot&#xff0c;那这篇文章就来讲一下如何用function来快速开发bot。 我们先创建一个azure function资源&#…

关于深度学习,这些知识点你需要了解一下

深度学习概述 o 受限玻尔兹曼机和深度信念网络 o Dropout o 处理不平衡的技巧 o SMOTE&#xff1a;合成少数过采样技术 o 神经网络中对成本敏感的学习 深度学习概述 在2006年之前&#xff0c;训练深度监督前馈神经网络总是失败的&#xff0c;其主要原因都是导致…