上篇文章介绍了什么是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 里找到上面的源代码。

Teams Bot开发系列:Activity处理流程相关推荐

  1. Teams Bot开发系列:初识Bot

    上次我们讲了Teams Bot开发的概述,讲了Azure Bot Service,Bot Framework SDK和我们自己的bot服务的概念,这篇文章就带大家看看Azure Bot Service ...

  2. Teams Bot开发系列:Teams的Activity处理

    上一篇文章讲了activity处理的流程,我们bot的核心处理逻辑放在ActivityHandler的子类里,通过重载OnMessageActivityAsync()方法来实现. 这篇文章我来讲一下对 ...

  3. Teams Bot开发系列:Activity和Turn

    这篇文章我们来说一下Activity和Turn这两个bot framework中最重要的两个概念,同时也介绍一下TurnContext和BotAdapter Activity 一个activity是聊 ...

  4. Teams Bot开发系列:Middleware

    middleware是目前一些framework比较流行的概念,通常一个开发框架需要提供一些可扩展可定制化的功能.所以middleware这种pattern就很实用. 熟悉asp.net core的开 ...

  5. Teams Bot开发系列:Bot验证

    我们今天来说一下authentication,authentication一直是一个复杂的问题.bot里的authentication也不简单.我们先来看一个概念:Bot Framework Toke ...

  6. openresty开发系列31--openresty执行流程

    openresty开发系列31--openresty执行流程 我们先看个例子 location /test {     set $a 32;     echo $a;     set $a 56;   ...

  7. Teams Bot App 初探

    上一篇文章深入讲了incoming webhook.这篇文章我们来看一个稍微复杂点的,正式点的 teams app:bot. 我们先来和之前一样,通过teams toolkit 的 sample ga ...

  8. 如何开发Teams Bot

    很多朋友问我如何开发一个成功的Teams Bot,他们说Bot Framework SDK看起来简单,但是真要的去开发一款成熟的bot,很多地方还是不知道如何使用.我从最早的bot framework ...

  9. 用AzureFunction开发最简单的Teams Bot

    之前我有一篇文章讲了如何在azure function上开发最简单的outgoing webhook,收到一些反馈,建议我介绍一下如果在azure function上开发teams bot,那这篇文章 ...

最新文章

  1. # W3C 中文离线教程 2016 年版
  2. 考前自学系列·计算机组成原理·不同形式的机器数的取值范围
  3. 【模拟】P1067 多项式输出
  4. 是可改写的随机存储器_关于存储器的一些基础知识整理
  5. Redis数据结构之集合
  6. 为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢...
  7. 使用PagedDataSource给Repeater、DataList增加分页
  8. 新常态 新核心,浪潮商用机器为关键行业数字化转型打造新Power
  9. java全局变量和局部变量_Java 10:局部变量类型推断
  10. EasyUI美化界面项目系统(整合EasyUI_Insdep皮肤)
  11. 贾俊平统计学思维导图- 第九章 分类数据分析
  12. 图像mnf正变换_PIE SDK最小噪声变换
  13. delphi 各版本的特性
  14. 体绘制加速技术之数据异步传输
  15. C1任务01 植物大战僵尸存档修改
  16. 常用或特别的人类fasta参考基因组下载链接
  17. EricChu的雅思之路——2020雅思A类考试切身体会\自学备考建议\考试完整流程(最详细版请耐心阅读)
  18. 2018.1.7 计算机算法课后习题总结
  19. RTSP/GB28181/SDK/Ehome协议人脸识别/车牌识别视频智能分析系统EasyCVR获取播放地址和流地址方法介绍
  20. android国际化设置语言后不起作用,Android旋转屏幕后国际化语言失效的解决的方法...

热门文章

  1. 编程应该用 Mac ,还是 PC ?
  2. 服务器系统玩dnf,win7系统玩dnf提示正在连接服务器的解决方法
  3. 注入双括号报错注入_SQL手动注入:sqlilabs(less110)
  4. 订阅号 图文回复php,微信开发(PHP实现订阅号的公众号配置和自动回复)
  5. javascript中interval与setTimeOut的区别
  6. c++ pat 乙级 ---1004 成绩排名
  7. keynote使用手册_如何使用Keynote和智能手机为AR创建原型
  8. 如何创建和谐的色彩系统
  9. 大三下学期十四周总结
  10. javascript获取时间差