使用dotnet template快速开发Microsoft Teams Outgoing Web Hook
在上一篇文章中,我们一步步从无到有在Microsoft Teams中开发了一个简单的Outgoing Webhook,并和我们本地的Web API应用程序产生交互,总结起来的步骤大概如下:
- 导航到“团队” Tab页, 选中需要建立的Channel, 选中“应用”这个Tab,点击最下方的“创建传出webhook”
- 开发传出webhook的后端服务
- 配置ngrok进行请求转发
- Team中发送消息,后端程序响应消息
这篇文章我们一起来看看如何使用dotnet的模板来快速开发一个带安全验证机制的Outgoing Webhook
1. 运行ngrok,记下转发的地址
2. 在teams里新建一个app,这次记下security token
具体的创建步骤见第一篇文章
3. 安装dotnet的模板
因为Teams的模板默认没有安装,所以我们需要在dotnet里添加模板
c:\demo> dotnet new -i MicrosoftTeams.Templates
4. 使用模板创建Teams Outgoing Webhook项目
运行以下命令来在当前目录下创建工程
c:\demo> dotnet new teamswebhook
使用VS code打开这个目录,找到appsettings.cs
文件,修改配置节点TeamsAppSecurityToken
, 填入我们创建Webhook时生成的security token
{"Logging": {"LogLevel": {"Default": "Warning"}},"AllowedHosts": "*","TeamsAppSecurityToken": "aDpHmzCh+z9r57niKFCew1AeI6tGjway5TfACZC7L88="
}
5. 运行程序
c:\demo> dotnet run
返回到Teams的对话框中,我们发送一条消息,观察Teams的消息返回
注意到消息正常返回,且提示我们尝试输入hero 或者 thumbnail
,那我们根据提示,分别发送hero和thumbnail
上面的整个过程就是我们基于Microsoft Teams的模板创建的整个可交互的Outgoing Webhook的应用,下面我们来分析下整个的代码结构:
首先,看到Services
中定义的接口ITeamsAuthProvider.cs
:
public interface ITeamsAuthProvider
{/// <summary>/// Validates the specified authentication header value./// </summary>/// <param name="request">The HTTP request message.</param>/// <returns>/// Response containing result of validation./// </returns>TeamsAuthResponse Validate(HttpRequest request);
}
其中的Validate
方法用于对请求的授权认证,TeamsAuthProvider.cs
继承ITeamsAuthProvider
,实现了Validate
的认证授权逻辑。这个验证用来确保这个请求是从微软Teams的服务器发过来的,而不是其他恶意的程序发送的请求,从而确保的请求的发起源是受信任的。
接着看下MessagesController
中,GetMessage
这个Action,首先实现对请求授权的判断,
var authResult = _teamsAuth.Validate(this.Request);
if (!authResult.AuthSuccessful)
{return new Activity(){Text = "You are not authorized to call into this end point."};
}
重点我们看下下面这段代码,
Attachment attachment = null;
if (activity.Text.Contains("hero", StringComparison.InvariantCultureIgnoreCase))
{var card = CreateSampleHeroCard();attachment = new Attachment(){ContentType = HeroCard.ContentType,Content = card};
}
else if (activity.Text.Contains("thumbnail", StringComparison.InvariantCultureIgnoreCase))
{var card = CreateSampleThumbnailCard();attachment = new Attachment(){ContentType = ThumbnailCard.ContentType,Content = card};
}
从上面的代码中看到,我们在Teams中发送hero
或者thumbnail
时,会看到响应的消息是一个带有图片的消息回复,具体的这种图片消息, 我们可以简单理解为是一种图片附件的形式,我们来分析其中hero
图片附件的代码:
private HeroCard CreateSampleHeroCard()
{return new HeroCard(){Title = "Superhero",Subtitle = "An incredible hero",Text = "Microsoft Teams",Images = new List<CardImage>(){new CardImage(){Url = "https://github.com/tony-xia/microsoft-teams-templates/raw/master/images/cbd_after_sunset.jpg"}},Buttons = new List<CardAction>(){new CardAction(){Type = "openUrl",Title = "Visit",Value = "http://www.microsoft.com"}}};
}
可以比较清楚的看到,一些标题Title和显示问题Text, 其中Image作为显示图片URL, 这里的Buttons
是这一种行为,当我们点击时,跳转到对应设置的网站,点击可以看到跳转到微软的官网。
可以看到使用dotnet template来创建outgooing webhook项目方便快速,而且使用了card,使得返回的消息格式非常丰富。
使用dotnet template快速开发Microsoft Teams Outgoing Web Hook相关推荐
- Microsoft Teams的Outgoing Webhook开发入门
Microsoft Teams的应用程序有几种形式: Tabs Bots Connectors Messaging extensions Activity feed integrations Outg ...
- 重磅!微软发布新一代 Teams 开发工具 —— Teams Toolkit!不止VS Code extension!
今天凌晨(北京时间 2021 年 5 月 26 日),在一年一度的 Build 大会上,微软正式发布了新一代的 Teams 开发工具 -- Teams Toolkit. 截止到 2021 年 4 月份 ...
- JEECG 3.6 自定义表单版本发布,智能快速开发平台
JEECG 3.6(智能快速开发平台) 自定义表单版本发布 平台介绍: JEECG(J2EE Code Generation),一款基于代码生成器的JAVA快速开发平台,集成强大代码生成器和在线开发机 ...
- JEECG Framework 3.5.2 (快速开发平台) ACE版本发布
平台介绍: JEECG(J2EE Code Generation),一款基于代码生成器的JAVA快速开发平台,集成强大代码生成器和在线开发机制,在线报表配置机制. ------------------ ...
- 开发指南专题一: JEECG微云快速开发平台前言
JEECG微云快速开发平台-前言 1. 前言 1.1. 技术背景 随着WEB UI 框架(EasyUI/Jquery UI/Ext/DWZ)等的逐渐成熟,系统界面逐渐实现统一化,代码生成器也可以生成统 ...
- springmvc+activiti 完美整合- 流程在线设计+代码生成器+UI快速开发库,提高一半的开发效率
JEECG(J2EE Code Generation) 是一款基于代码生成器的智能开发平台,采用代码生成+手工MERGE半智能开发模式, 可以帮助解决Java项目60%的重复工作,让开发更多关注业务逻 ...
- JEECG V3.0版本 (工作流在线定义+UI快速开发库+代码生成器) 全新架构技术,漂亮的界面+智能代码生成+智能工作流
简要说明 JEECG V3.0版本推翻原有SSH2架构,采用SpringMVC+Hibernate+Spring jdbc基础架构, 采用面向声明的开发模式,基于泛型方式编写极少代码即可实现复杂的数据 ...
- JEECG V3.0 版本(jbpm5 工作流自定义+WEB UI快速开发库+代码生成器) spring mvc +hibernate
简要说明 JEECG V3.0版本推翻了原有SSH2架构,采用SpringMVC+Hibernate+Spring jdbc基础架构, 采用面向声明的开发模式,基于泛型方式编写极少代码即可实现复杂的数 ...
- openjweb1.8 java web应用快速开发平台产品白皮书
因图片较多,需要图片请到资源中下载,不需要资源分. OpenJWeb(1.8) Java Web应用快速开发平台 产品白皮书 编者:OpenJWeb ...
最新文章
- 双边滤波+ 通俗自己理解
- zookeeper集群自动启动脚本
- 安装redis并开启_如何安装Redis,以及对Redis配置文件的更改和测试
- chapter8.1、面向对象
- 未来5年中国企业信息化格局
- 强烈推荐SQL Prompt 3.8,并发布SQL Prompt 3.8 ,SQL Refator 的xxx
- 2022年Java秋招面试必看的 | 微服务面试题
- STM8L开发环境配置
- 绩效考核管理方案文档
- 【实践与问题解决30】苹果手机如何取消使用切换控制时候弹出的重要通知
- 关于“堆栈”的含义及理解
- BLE4.0广播连接过程的底层剖析
- 2014中国高中排行榜发布 华中师大一附中居首
- tecplot云图——数据文本格式2
- python石头剪刀布游戏代码输入格式随机数种子设置为0_Python模拟石头剪刀
- 设备描述符请求失败解决
- 提取 Office 2016 工具栏图标
- 《沙漠自然教育项目全纪实》发布 圣牧有机让绿色的种子种进更多孩子心里
- 使用 scoped-slot 去设置缩略图模版,成功上传图片之后回显,在进行编辑,保存成功,但是报错
- 量子计算机院士,厚积薄发!中科院院士宣布重要消息,又一技术世界领域领先全球...
热门文章
- 哎!又要过年了,程序员最怕问到什么?
- CSS实现垂直居中的5种方法
- list 排序_十个必知的排序算法|Python实例系列
- mysql 数据库事务处理_Mysql事务处理问题 - mysql数据库栏目 - 自学php
- tfpose与openpose区别_人体姿态识别--Openpose+Tensorflow
- skysat重访周期_重访小恶梦
- Vue、React 之间如何实现代码移植?
- SparkSQL 之 Shuffle Join 内核原理及应用深度剖析-Spark商业源码实战
- [SDOI2015]约数个数和
- Nginx服务状态的监控