上篇文章介绍了什么是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. Java复习2-对象与类
  2. Python程序设计题解【蓝桥杯官网题库】 DAY9-基础练习
  3. PhoneGap/Cordova Android应用签名发布系列问题处理收集
  4. 小白的算法初识课堂(part9)--SHA及Simhash算法
  5. python中exec是什么意思_Python中的进程分支fork和exec详解
  6. 路由器ospf动态路由配置
  7. 关于cocos2dx导入安卓项目至eclipse的诸多问题
  8. Xendesktop 5.0与view 4.5对比的看法
  9. mysql limti_MYSQL分页 limint
  10. LAMMPS学习总结1
  11. 首位华人女数学家获拉马努金奖!北大数院校友,陶哲轩恽之玮曾得过此奖
  12. shell+curl+fortune+pushplus–>每日一言
  13. 面向构件的软件设计问答
  14. NOI2019滚粗记
  15. uniapp 收藏功能实现及组件封装
  16. 矩阵变换:矩阵是怎样变换向量的
  17. unity3d 如何UI优化和减少DC(DrawCall)
  18. html中鱼眼效果,鱼眼效果和放大效果怎么做
  19. 读Applying Deep Learning To Airbnb Search有感
  20. RANCID完全安装

热门文章

  1. eureka 其它语言_SpringCloud之Eureka-Go语言中文社区
  2. 事业单位考试题库计算机网络,2015年事业单位计算机基础知识试题及答案
  3. 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)
  4. 中关键字 表示空类型_C语言数据类型
  5. 常见电容器图片_各种电容器图片大集合
  6. Lucene学习总结之三:Lucene的索引文件格式(2)
  7. 万物互联之~RPC专栏
  8. 思科设备snmp配置。
  9. 在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)
  10. 黑客窃取思科、IBM与甲骨文认证管理系统内的敏感数据