使用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,记下转发的地址

ngrok_requesttracker_console

2. 在teams里新建一个app,这次记下security token

具体的创建步骤见第一篇文章

bottoken

3. 安装dotnet的模板

因为Teams的模板默认没有安装,所以我们需要在dotnet里添加模板

c:\demo> dotnet new -i MicrosoftTeams.Templates

installed-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的消息返回

tryhi

注意到消息正常返回,且提示我们尝试输入hero 或者 thumbnail,那我们根据提示,分别发送hero和thumbnail

superhero

superhero

上面的整个过程就是我们基于Microsoft Teams的模板创建的整个可交互的Outgoing Webhook的应用,下面我们来分析下整个的代码结构:

superhero

首先,看到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,使得返回的消息格式非常丰富。

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

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

相关文章

[Swift]LeetCode1013. 将数组分成和相等的三个部分 | Partition Array Into Three Parts With Equal Sum...

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

京津冀产业协同升级 智慧城市等高端产业需求遇热

云计算、智慧交通、城市环保科技等高端智慧城市产业项目正成为京津冀产业协同的新关注点。 21日&#xff0c;在由北京市经信委、天津市工信委、河北省工信厅联合组织的京津冀产业协同发展招商推介专项行动上&#xff0c;超过200家与会企业共完成产业对接项目额达311.7亿元。与以…

Microsoft Teams:删除成员账户其历史聊天会发生什么?

介绍&#xff1a; 此博客文章的目的是演示从Office 365删除用户的账号后&#xff0c;此用户在Microsoft Teams群聊和私聊中的历史聊天记录会发生什么改变。 以下是Microsoft Teams聊天对话&#xff0c;其中Adele和其他团队成员正在参与对话&#xff1a; 此外, Adele和Mega还在…

PostgreSQL Huge Page 使用建议 - 大内存主机、实例注意

标签 PostgreSQL , Linux , huge page , shared buffer , page table , 虚拟地址 , 物理地址 , 内存地址转换表 背景 当内存很大时&#xff0c;除了刷脏页的调度可能需要优化&#xff0c;还有一方面是虚拟内存与物理内存映射表相关的部分需要优化。 1 脏页调度优化 1、主要包括…

Microsoft Teams:团队Owner离开公司后,我们该怎么做?

您是否曾在这么一个团队里&#xff0c;该团队唯一有Owner权限的人离开了公司&#xff1f;不幸的是,如果这个人不再在公司里&#xff0c;您可能觉得没有办法让其他团队成员再成为team的owner。我有一个简单易用的解决方案&#xff0c;但您需要成为Office 365租户的Admin或联系你…

python网络编程-socket编程

一、服务端和客户端 BS架构 &#xff08;腾讯通软件&#xff1a;serverclient&#xff09; CS架构 &#xff08;web网站&#xff09; C/S架构与socket的关系&#xff1a; 我们学习socket就是为了完成C/S架构的开发 二、OSI七层模型 互联网协议按照功能不同分为osi七层或tcp/ip五…

使用PowerShell配置Microsoft Teams

作为 IT 专业人员, 我一直在寻找自动化任务的方法, 并使日常操作简单。当使用Microsoft Teams时, 是否能够在团队中自动创建团队&#xff0c;渠道和设置对于Microsoft Teams组建的成功与否至关重要。PowerShell对Microsoft Teams的支持使您可以做到这一点&#xff0c;它为我提供…

常见Kotlin高频问题解惑

在笔者的Kotlin交流群里&#xff0c;不少同学反复遇到了一些相似的问题。这些问题大都比较基础&#xff0c;但又容易产生误解。因此&#xff0c;我决定写一篇文章&#xff0c;整理群里同学遇到的一些问题 变量和常量的使用 在Kotlin语言中&#xff0c;我们使用var声明变量&…

关于神经网络训练的一些建议笔记

关于网络训练时的参考建议&#xff1a; 1.train loss不断下降&#xff0c;test loss不断下降&#xff0c;网络正在学习 2.train loss不断下降&#xff0c;test loss趋于不变&#xff0c;网络过拟合&#xff0c;需要增大数据&#xff1b;减小网络规模dropout&#xff1b;权重衰减…

Microsoft Teams的保留策略

Microsoft Teams保留策略现在可在Office 365安全性和合规性中心里进行配置 今天&#xff0c;我们很自豪地宣布&#xff0c;我们正在开始推出针对Microsoft Teams的保留策略。 推出预计将在未来几周内完成。 通过此次发布&#xff0c;Teams管理员可以使用Office 365安全性和合规…

八年溯源,如何巧搭区块链

虎嗅注&#xff1a;区块链正在逐步商业化&#xff0c;但最大的挑战是共识。 为什么这样说&#xff1f;因为商品的溯源防伪业务在过去正是因为缺乏信任感而没有得到普及&#xff0c;这是每个溯源从业者最大的感受。 在虎嗅虎跑团每两周一次线上分享会上&#xff0c;溯源链创始人…

数字签名过程及数字证书

数字签名是什么&#xff1f; 作者&#xff1a;David Youd 翻译&#xff1a;阮一峰 原文网址&#xff1a;http://www.youdzone.com/signature.html 1.鲍勃有两把钥匙&#xff0c;一把是公钥&#xff0c;另一把是私钥。 2.Bob把公钥送给他的朋友们-Pat、Doug、Susan-- 每人一把…

Teams与OneDrive for Business和SharePoint的关系

作为一个相对看重个人信息安全与隐私的人&#xff0c;个人附件等资料在Microsoft Teams中的存储方式、文件访问权限、可见范围问题引起了我的好奇。 众所周知&#xff0c;Teams包含3大主要的模块&#xff1a;单人聊天、团队、会议。那下面让我们一起来看一下&#xff0c;对这三…

hadoop学习笔记(二):centos7三节点安装hadoop2.7.0

环境win7vamvare10centos7 一、新建三台centos7 64位的虚拟机 master 192.168.137.100 root/123456 node1 192.168.137.101 root/123456 node2 192.168.137.102 root/123456 二、关闭三台虚拟机的防火墙&#xff0c;在每台虚拟机里面执行&#xff1a; systemctl sto…

index.html 的默认301或者302跳转

index.html 的默认301或者302跳转 <!DOCTYPE html> <html> <head> <title>Google</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> <script>window.locat…

在Microsoft Teams中的Visio协作

所有Team站点都带有专用文件库&#xff0c;用于存储所有工作组的内容。 您现在可以从桌面或云存储站点将Visio文件上载到此库&#xff0c;例如&#xff0c;您所在Team的资产都集中在一个位置&#xff0c;供具有权限的任何人进行访问。与其他存储文件一样&#xff0c;您可以直接…

用区块链打击假新闻 这可能是最2017年的一件事

据外媒报道&#xff0c;非营利性基金会PUBLIQ公布了一个基于区块链打造的平台。这是一个用于创建和分享原创新闻和媒体内容的平台&#xff0c;它将在近期推出。据了解&#xff0c;PUBLIQ创建这一平台则是希望能借用类似于比特币一样的系统来打击假新闻。 通过创建一个受信任的经…

oo面向对象第一单元总结

oo第一次作业主要考察了多项式的求导&#xff0c;从简单的幂函数求导到三角函数求导再到嵌套函数的求导&#xff0c;难度循序渐进&#xff0c;对我们对于面向对象的理解的要求也在一次一次提升。一行行代码打下来&#xff0c;一夜夜熬过去&#xff0c;我也来到了这个短暂的停靠…

Microsoft Teams免费版本初体验

Microsoft Teams推出有一段时间了&#xff0c;如果想要体验Teams&#xff0c;必须需要有Office365的订阅。最近微软为了进一步推广Teams&#xff0c;突然宣布Teams免费了。使用过Teams的读者知道Teams是基于Office365账号和组的&#xff0c;那它免费后&#xff0c;不使用Office…

JS:封装函数判断数据类型

思路 1 ).根据 typeof() 的返回值将数据分为2种情况 a.返回值为 string number boolean undefined function (直接返回 typeof() 的返回值) b.返回值为object 2 ).再将 typeof() 返回值为 object 的数据分为2种情况 a.null (直接返回自身) b.包装类 对象 数组 (再进行细分) var…