VS Code部署Teams webhook到Azure Functions

点击上方蓝字

关注我们

(本文阅读时间:6分钟)

Microsoft Teams这款产品对于我们来说已经很熟悉了,作为开发者,我们也可以通过官方的一些开发模式来build我们自己的Teams应用。

今天快速跟大家分享一下,如何在VS Code中部署Azure Function(Azure Serverless的一种解决方案),并将其作为Teams的webhook地址。

微软MVP实验室研究员

1f2d1aa0e3ee6fe84d1e62799a9cfeac.png

09272d813bb10569ae326212f6412fbb.png

张坤

微软最有价值专家(MVP)。目前技术方向是 .NET,微服务,Microsoft Azure及Microsoft Teams应用开发。

68d119c47b8aa6cae56c72ecf924c7c8.png

准备环境

3d0a8ed6b097c6e83b20be4dd9011c0a.png

1. 准备Azure Account和Microsoft Teams账号

2. VS Code

1) 下载安装

2) 为VS Code安装Azure的Extension

3. Microsoft Teams (客户端或Web版都可以)

4. 下载代码:

  • 地址:https://github.com/paul-cheung/outgoing-web-hook-sample

新建项目

91563fa17f7213327700bca3126a6581.png

1. 根据Extension的选项登录Azure Account,选择subscription。

2. VS Code打开下载的代码(或自己创建),Azure的Extension就会识别到。

90bf11104b742ca39fcca74e0109fca5.png

3. 查看项目内容。这里就是简单的api function,接受Activity请求模型(微软的Bot Framework),并标记了function的trigger类型是httptrigger,认证级别也是匿名的,这样在call这个api的时候就不需要提供token了。当然实际情况是需要有token验证的,这里不多介绍。

0e501ab6087c00bd7fdc46c8301728b5.png

部署项目

e7cf1deb14a0978cbb6bfd0b8e55eb18.png

1.build项目,点击Deploy to Function App,一路操作。

86e0284f1386535f4fd0b2f4ff39c073.png

2. 选择对应的subscription 

3374a325629ef0fdb3001eed94af66ae.png

3.  选择deploy到已有的function app还是新建,根据自己需要。我这里直接覆盖已有的。

7ea7ff09f1dd0b4e7c49e765975df7b8.png

如果是新建的话,会提示输入名称,这里正常输入名称就行,如:

85c5987cdedb9e5c56f7865c09a822f1.png

4.  选择Location。需要指定我们的app部署到哪个region。

135dcbe4440bfe462ac99b56b73fc780.png

5. 等待部署。

72a90d6fe9314be891f815c8df57b141.png

fb784d104118a82832e160e933d3f0b7.png

ad04167047995f50ac1b6f76b81e6079.png

或者看output的Log 

9eada782364927d692376e9feba5efe7.png

提示相关resource已经创建好,部署完成。

检查部署情况

17324f920757c13cc755b5dc9556e7ba.png

我们登录Azure Portal检查一下部署情况。

可以看到URL一栏,就是我们OutgoingWebhook的地址。 

f818db867177638814a8341e79c9702e.png

配置Teams里的Webhook

5aefdc9562a6362fd8fdc1e9aa841b69.png

上面已经将服务部署在Azure Functions上,接下来打开Teams进行Webhook配置。

1.首先登入账号到Teams,定位到team的app标签页:

f6d4d4633f1c699ea47e127b26e671c3.png

2.点击Create an outgoing webhook,填写名称和Callback URL。 

11cf1e57096ddc7a9cdcc1727c6eb539.png

Callback URL来自这里: 

0922e4e81c66d950cdb8de68e2537e66.png

3.创建webhook完会提示保存token(妥善保存就行,我们这里暂时不用它,略过认证部分) 

fe191b0ea90a7a8d54811a5b7f1eddac.png

验证效果

d540a96186222da01614422888886356.png

以上已经成功创建了outgoing webhook,并且这个hook是调用到azure function的。现在测试一下效果。

1. 我们再到team的channel里给它发消息(at它) 

29f81d67ea80852e893dc116d71a537d.png

2. 随便发个什么消息,然后会得到回复 

65d0f2211fddb2f383175533143d263a.png

总结

7a65060ae0f7ffc3d38a5abee671f277.png

在Teams App的开发过程中,我们经常会使用ngrok来做反向代理/内网穿透,这里就提供了另一种途径,可以将我们写好的bot代码一键部署到cloud端,也是有助于提高我们的开发效率。

使用serverless的azure实现来简化我们的部署,当然还有其它的service可以达到同样的目的,这里算是抛砖引玉,大家可以多尝试其他好方法。感谢阅读。

相关链接:

  • https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview

  • https://www.microsoft.com/en-sg/microsoft-teams/download-app

微软最有价值专家(MVP)

9ab5628675ee6060bac313e6a48c3330.png

微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项。29年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项。

MVP 是经过严格挑选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的热情并乐于助人的专家。MVP 致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人,并最大程度地帮助微软技术社区用户使用 Microsoft 技术。
更多详情请登录官方网站:
https://mvp.microsoft.com/zh-cn

f03d9f8e3d93a0c4424b647765c9f151.png

谢谢你读完了本文!欢迎在评论区留言分享你的想法,并且转发到朋友圈

如果你对本文青睐有加,想要转载到自己的平台,请在后台回复「转载」与我们取得联系!

23641ed21b266b6258f24af84268242b.png

长按识别二维码

关注微软中国MSDN

31216dbb0fd3b8e4e7291a8bcff17a43.gif

Azure Functions 简介 

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

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

相关文章

记一次TCP连接异常故障解决

为什么80%的码农都做不了架构师?>>> 一.情况表现为 1.在公司内网对站点的http访问: linux主机出现故障:curl以及抓包分析,发现服务端不响应linux客户端的请求,无法建立TCP连接,浏览器返回“无法…

微软官方pe工具_微软官方下载工具

二、进入官网下载百度搜索“win10下载”进入微软官网win10下载地址,点击“立即下载工具”开始下载;三、运行软件下载完成后,右键以“管理员身份”打开,点击“接受”。四、选择用途选择第一个升级自己的电脑;选择第二个…

Task.Factory.StartNewTResult 和 Task.RunTResult 到底有什么区别?

前言这不是和《Task.Factory.StartNew 和 Task.Run 到底有什么区别?》一样吗,怎么又写一篇?起先我也是这么觉得的,但实际发现并非如此。实现代码查看这 2 个方法的内部实现,其内部实现逻辑其实是一样的,只是…

【遥感物候】C#遥感数据GIMMS 3G NDVI头文件批量生成器(几何校正)

长时间序列全球NDVI数据GIMMS 3g(点击下载),原数据无投影,格式为VI3g,IE浏览器下载的为.txt格式。GIS软件无法直接打开,Envi 5可以打开。 ENVI中点击File->Open File as->Binary会弹出填写元数据的窗口,填写基本信息: Envi5.1中打开二进制(Binary)数据是,需要…

分享一个基于.NET6包含DDD,ES,CQRS等概念的开源项目

当你在学习DDD、CQRS或时间溯源时,除了大量的学习资源(比如书籍和文章)之外,你还接触到了许多概念,这些资源只是在讨论理论问题。这很好,我们知道他们在说什么,但我们如何在一个真正的项目中使用…

React Native之通过createStackNavigator实现携带参数的页面与页面之间的跳转

1 实现的功能 在网上看React Native文档,我特码就想实现一个页面到另外一个页面的跳转,然后另外一个页面怎么获取参数,特么没找到一个说清楚的,要么太复杂,要么说了不理解,下面是我自己写的一个App.js文件,实现一个Home页面跳到另外Details页面,并且携带了参数怎么在Details页…

google浏览器插件 开发 获取页面指定数据_程序员必备的4款Chrome插件,编程神器...

一直有粉丝留言,想要大侠推荐几款程序员使用的插件,大侠特意去问了隔壁的程序员哥哥,终于被我问出了这4款编程神器!这4款插件不仅仅是提高效率那么简单哦,还可以让你的Chrome浏览器变得高端大气,一起来看看…

MATLAB多元非线性回归

解释变量:商品价格(x1)人均月收入(x2),被解释变量:商品需求量(y),进行二元回归分析,并进行检验 商品价格(元/件) 月收入(元) 需求(件) 89 …

.NET高级调试 | 通过JIT拦截无侵入调试 C# Emit 生成的动态代码

大家还记得上一篇的测试代码吗?我们用了:Console.WriteLine("Function Pointer: 0x{0:x16}", Marshal.GetFunctionPointerForDelegate(addDelegate).ToInt64());来获得 委托 的 函数指针 地址,通过这个突破口最终实现了 动态代码 的…

使用IAR开发CC2530遇到的两个问题

2019独角兽企业重金招聘Python工程师标准>>> 首先说明,IAR for 8051为7.51版本,操作系统为windows7 32位。 上手CC2530,在IDE的使用上就遇到了2个问题。 一个是用SmartRF Programmer Flash下载HEX文件不成功,提示说cou…

openssh登陆时提示服务器拒绝了密码

升级openssh7.5后,登陆报错按照网上的说法是不允许root用户登陆但是,/etc/ssh/sshd_config 已经写入PermitRootLogin yes解决方法:设置/etc/sysconfig/selinux 中的SELINUXdisabled然后重启就OK了转载于:https://blog.51cto.com/adamcrab/194…

Blazor University (10)组件 — 捕获意外参数

原文链接&#xff1a;https://blazor-university.com/components/capturing-unexpected-parameters/捕获意外参数源代码[1]之前我们已经看到了如何使用特定名称声明参数和级联参数。例如&#xff0c;一个将 <img> 元素包装在一些自定义 HTML 中的自定义组件。<div cla…

React Native之最构建对象通过构造方法传递值然后再获取值

1 问题 在一个文件构建一个对象,然后在另外一个文件里面new这个对象,通过构造方法传递参数,然后再获取这个参数 2 测试代码 Student.js文件如下 use strict;import React from reactimport {NativeModules, NativeEventEmitter, DeviceEventEmitter,Alert} from react-nativ…

.NET点滴:SpanT

昨天小桂问了一个问题&#xff0c;把一个数组的全部元素加1&#xff0c;有什么好办法&#xff0c;于是有了下面的分析&#xff1a;var arr new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //方法一 foreach (var i in arr) {i; } //方法二 for (var i 0; i < arr.Length; i) {…

React Native之通过DeviceEventEmitter发送和接收事件

1 怎么实现发送和接收事件 理论上封装了Android原生广播的代码,需要注册和反注册,这里用DeviceEventEmitter实现 //增加监听 DeviceEventEmitter.addListener //取消监听 //this.emitter.remove(); 这里可也可以通过安卓原生向页面js发送消息,可以参考我的这篇博客 React Nat…

navicat循环执行上下两行相减sql语句_SQL太难?你离完全理解SQL就差这10步!

- 点击上方“中国统计网”设置⭐星标不迷路&#xff01;-很多程序员视 SQL 为洪水猛兽。SQL 是一种为数不多的声明性语言&#xff0c;它的运行方式完全不同于我们所熟知的命令行语言、面向对象的程序语言、甚至是函数语言(尽管有些人认为 SQL 语言也是一种函数式语言)。我们每天…

mysql游标书写_mysql中光标如何书写

mysql中光标书写的方法&#xff1a;首先声明光标&#xff1b;然后开启光标&#xff0c;代码为【OPEN cursor_name】&#xff1b;接着捕获光标&#xff1b;最后关闭光标&#xff0c;代码为【CLOSE cursor_name】。本教程操作环境&#xff1a;windows7系统、mysql5.8版&#xff0…

上海女白领吃火锅碰瓷,支付宝口碑居然真的要赔?

昨天中午&#xff0c;新闻晨报在微博上发出一条新闻&#xff1a;上海一位汪小姐吃火锅的时候&#xff0c;因用支付宝口碑扫码中了一个999元大红包&#xff0c;结果因为太激动手机不小心掉进油汤里&#xff0c;捞出来以后开不了机了。关键是这位小姐觉得这是口碑和商家活动导致的…

ASP.NETCore统一处理404错误都有哪些方式?

当未找到网页并且应用程序返回 404 错误时&#xff0c;ASP.NET Core MVC 仅呈现通用浏览器错误页面&#xff0c;如下图所示这不是很优雅&#xff0c;是吗&#xff1f;我们平时看到的404页面一般是这样的还有这样的试了下京东&#xff0c;地址不存在的时候是会重定向到首页下面就…

React Native之组件(Component)生命周期学习笔记

1、Component介绍 一般Component需要被其它类进行继承&#xff0c;Component和Android一样&#xff0c;也有生命周期 英文图片如下 2 具体说明 1)、挂载阶段 constructor() //构造函数,声明之前先调用super(props) componentWillMount()//因为它发生在render()方法前&…