前言

上一篇我们通过实战分享了使用Go推送钉钉消息,由于技痒,笔者现在也编写了一个.NET Core的Demo,作为简单的对照和说明。

最后,由于精力有限,笔者希望有兴趣的朋友可以分享下使用CoreRT将.NET Core编译成机器代码这块的实践。

目录

  • 使用.NET Core推送钉钉消息

  • 获取参数

  • 设置消息数据格式

  • 发送请求

  • 设置Dockerfile

  • 运行并设置环境变量推送消息

使用.NET Core推送钉钉消息

这里我们使用.NET Core来完成相关需求,注意,这里是.NET Core,而不是ASP.NET Core。需求和上面类似,工程相关依赖如下所示:

<PackageReferenceInclude="Microsoft.Extensions.Configuration"Version="2.2.0"/>

<PackageReferenceInclude="Microsoft.Extensions.Configuration.CommandLine"Version="2.2.0"/>

<PackageReferenceInclude="Microsoft.Extensions.Configuration.EnvironmentVariables"Version="2.2.0"/>

<PackageReferenceInclude="Microsoft.Extensions.Http"Version="2.2.0"/>

<PackageReferenceInclude="Newtonsoft.Json"Version="12.0.1"/>

以下是相关的主体代码:

获取参数

从环境变量或者命令行参数获取配置:

///<summary>

///环境变量列表

///</summary>

privatestaticreadonlystring[] EnvList =

{

//钉钉机器人地址

"WEBHOOK",

//@的手机号码

"AT_MOBILES",

//@所有人

"IS_AT_ALL",

//消息内容

"MESSAGE",

//消息类型(仅支持文本和markdown)

"MSG_TYPE"

};

privatestaticvoid Main(string[] args)

{

var config = newConfigurationBuilder()

//支持命令行参数

.AddCommandLine(args)

//支持环境变量

.AddEnvironmentVariables()

.Build();

#region参数检查

foreach (var envName in EnvList)

{

var value =config[envName];

if (string.IsNullOrWhiteSpace(value)&& envName != "AT_MOBILES" && envName != "IS_AT_ALL")

{

Console.WriteLine($"{envName}不能为空!");

return;

}

}

if (string.IsNullOrWhiteSpace(config["AT_MOBILES"]) && string.IsNullOrWhiteSpace(config["IS_AT_ALL"]))

{

Console.WriteLine("必须设置参数 AT_MOBILES 和 IS_AT_ALL 两者之一!");

return;

}

#endregion

try

{

//推送消息

SetDataAndSendWebhooks(config).Wait();

}

catch (Exception ex)

{

Console.WriteLine(ex.ToString());

}

}

设置消息数据格式

设置消息格式,为了简单,这里我们使用匿名类:

///<summary>

///设置消息并调用Webhook

///</summary>

///<param name="config"></param>

///<returns></returns>

privatestaticasync Task SetDataAndSendWebhooks(IConfigurationRoot config)

{

var at = new

{

AtMobiles = config["AT_MOBILES"]?.Split(','),

IsAtAll = Convert.ToBoolean(config["IS_AT_ALL"] ?? "false")

};

switch (config["MSG_TYPE"])

{

case"text":

{

var data = new

{

Msgtype = "text",

Text = new

{

Content =config["MESSAGE"]

},

At = at

};

awaitSendWebhooks(config["WEBHOOK"], data);

break;

}

case"markdown":

{

var data = new

{

Msgtype = "markdown",

Markdown = new

{

Title = "钉钉通知",

Text = config["MESSAGE"]

},

At = at

};

awaitSendWebhooks(config["WEBHOOK"], data);

break;

}

default:

{

Console.WriteLine($"不支持的格式:{config["MSG_TYPE"]}");

break;

}

}

}

发送请求

此处代码使用Newtonsoft.Json做JSON序列化,然后使用Microsoft.Extensions.Http的HttpClient库来发送Post请求。

在数据格式这块,我们通过配置做了以下设置:

  • 忽略Null值。也就是为null的属性不做JSON序列化。

  • 设置属性命名规则为Camel-Case驼峰式命名法,首字母小写。

主体代码如下所示:

///<summary>

///调用webhook

///</summary>

///<typeparamname="T"></typeparam>

///<param name="url">webhook地址</param>

///<param name="data">消息</param>

///<returns></returns>

privatestaticasync Task SendWebhooks<T>(string url, T data) where T : class

{

JsonConvert.DefaultSettings = newFunc<JsonSerializerSettings>(() => newJsonSerializerSettings()

{

NullValueHandling =NullValueHandling.Ignore,

ContractResolver = newCamelCasePropertyNamesContractResolver()

});

var jsonData =JsonConvert.SerializeObject(data);

Console.WriteLine(jsonData);

using (var httpClient = new HttpClient())

{

var content = newStringContent(jsonData);

content.Headers.ContentType = newMediaTypeHeaderValue("application/json");

var result = awaithttpClient.PostAsync(url, content);

result.EnsureSuccessStatusCode();

Console.WriteLine($"Send webhook succeed. StatusCode:{result.StatusCode}");

}

}

设置Dockerfile

在之前我们已经讲述过,使用了分阶段构建。整个Dockerfile基本上使用VS Docker tool生成:

FROMmicrosoft/dotnet:2.2-runtime AS base

WORKDIR /app

FROMmicrosoft/dotnet:2.2-sdk AS build

WORKDIR /src

COPY DingTalk.NET/DingTalk.NET.csprojDingTalk.NET/

RUN dotnet restoreDingTalk.NET/DingTalk.NET.csproj

COPY . .

WORKDIR /src/DingTalk.NET

RUN dotnet buildDingTalk.NET.csproj -c Release -o /app

FROM build AS publish

RUN dotnet publish DingTalk.NET.csproj-c Release -o /app

FROM base AS final

WORKDIR /app

COPY --from=publish/app .

ENTRYPOINT ["dotnet", "DingTalk.NET.dll"]

# 注意不要单独使用 MAINTAINER 指令,MAINTAINER已被Label标签代替

LABEL MAINTAINER ="xinlai@xin-lai.com"

# LABEL指令用于将元数据添加到镜像,支持键值对和JSON,我们可以使用 docker inspect 命令来查看

LABELDingtalkComponent='{\

"description": "使用钉钉发送通知消息.",\

"input": [\

{"name": "WEBHOOK","desc": "必填, 钉钉机器人Webhook地址"},\

{"name":"AT_MOBILES", "desc": "非必填,被@人的手机号"},\

{"name":"IS_AT_ALL", "desc": "非必填,@所有人时:true, 否则为:false"},\

{"name": "MESSAGE","desc": "必填,自定义发送的消息内容"},\

{"name":"MSG_TYPE", "desc": "必填,自定义发送的消息类型,目前仅支持text和markdown"}\

]\

}'

编译完成后,我们来查看下镜像大小:

注意
通过上图我们可以看到,镜像大小不到200M,相比GO体重大了许多,但是相比其他语言却轻了不少。不过,我们可以通过官方开源库CoreRT将.NET Core编译成机器代码,也就是.NET Core也可以做到编译完成后只有几M大小。有兴趣的朋友可以分享下这块的实践。
运行并设置环境变量推送消息

我们使用PowerShell编写简单脚本如下所示:

docker build --rm-f "Dockerfile" -t dingtalk.net:latest .

docker run --rm -e"WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token={yourAccess Token}" `

-e "MESSAGE=*使用.NET Core发送钉钉消息。*" `

-e "IS_AT_ALL=true" `

-e "MSG_TYPE=markdown" `

-d dingtalk.net

效果如图:

往期内容链接

Docker最全教程——从理论到实战(一)

Docker最全教程——从理论到实战(二)

Docker最全教程——从理论到实战(三)

Docker最全教程——从理论到实战(四)

Docker最全教程——从理论到实战(五)

Docker最全教程——从理论到实战(六)

Docker最全教程——从理论到实战(七)

Docker最全教程——从理论到实战(八)    

Docker最全教程——从理论到实战(九)

Docker最全教程之使用Tencent Hub来完成CI(十)
Docker最全教程——数据库容器化(十一)
Docker最全教程——数据库容器化之持久保存数据(十二)
Docker最全教程——MongoDB容器化(十三)
Docker最全教程——Redis容器化以及排行榜实战(十四)

Docker最全教程之Ubuntu下安装Docker(十五)

Docker最全教程之树莓派和Docker(十六)

Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

Docker最全教程之使用Docker搭建Java开发环境(十八)

Docker最全教程之Go实战,墙裂推荐(十九)

转载是一种动力 分享是一种美德

如果喜欢作者的文章,请关注“magiccodes”订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

QQ群:

编程交流群<85318032>

产品交流群<897857351>

长沙线下技术社区已经创建,有兴趣者可以通过客服加群。接下来,我们会定期组织一些线下技术交流分享会,以飨大家。

Docker最全教程之使用.NET Core推送钉钉消息(二十)相关推荐

  1. Docker最全教程之使用 Visual Studio Code玩转Docker(二十一)

    VS Code是一个年轻的编辑器,但是确实是非常犀利.通过本篇,老司机带你使用VS Code玩转Docker--相信阅读本篇之后,无论是初学者还是老手,都可以非常方便的玩转Docker了!所谓是&qu ...

  2. Docker最全教程——Redis容器化以及排行榜实战(十三)

    Docker最全教程--Redis容器化以及排行榜实战(十三) 原文:Docker最全教程--Redis容器化以及排行榜实战(十三) 前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写 ...

  3. Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

    本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置.教程中也分享了一个简单的CI.CD流程,仅作探讨.不过由于篇幅有限,完整的DevOps,我们后续独立探讨. 为了降 ...

  4. Docker最全教程之树莓派和Docker(十六)

    前言 树莓派(Raspberry Pi)是一台卡片电脑(只有信用卡大小),我们可以使用树莓派做很多事情,比如智能家居的中控.航空器.BT下载器.挖矿机.智能机器人.小型服务器(花生壳+网站)等等. 目 ...

  5. Docker最全教程——从理论到实战(九)

    在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...

  6. Docker最全教程——从理论到实战(四)

    容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右并且一直在完善.补充具体的细节和实践,预计全部完成需要1到2个月的 ...

  7. Docker最全教程——从理论到实战(三)

    容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右,只是为了大家更好地了解.理解和消化这个技术,能够搭上这波车. 你 ...

  8. Docker最全教程——从理论到实战(六)

    Docker最全教程--从理论到实战(六) 原文:Docker最全教程--从理论到实战(六) 托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号"magiccodes"已经发 ...

  9. Docker最全教程——从理论到实战(一)

    Docker最全教程--从理论到实战(一) 目录 前言 随着生产力的发展尤其是弹性架构的广泛应用(比如微服务),许多一流开发者都将应用托管到了应用容器上,比如Google.微软.亚马逊.腾讯.阿里.京 ...

最新文章

  1. 【数论】数论基础合集
  2. 寻找兄弟单词(2012.5.6百度实习)
  3. [搜索]波特词干(Porter Streamming)提取算法详解(1)
  4. 如何在有scoped不影响elementUI 的其他页面组件,进行单页面修改的几种方法。
  5. matplotlib 显示批量图片_chapter4-1 简单数据可视化包Matplotlib整理1
  6. 软件包管理 之 Fedora / Redhat 软件包管理指南
  7. 音视频技术开发周刊(第125期)
  8. layui选项卡嵌套选项卡_在ProtoPie中使用嵌套组件构建选项卡栏
  9. 如何学习WPF技术?
  10. 【CodeForces - 227A】Where do I Turn? (计算几何,叉积判断直线拐向)
  11. JavaScript中BOM操作
  12. 读取和写入文件的最简单方法
  13. oracle merge into 优化,ORACLE 10g 的 merge into用法
  14. 【Oracle经典】132个oracle热门精品资料——下载目录
  15. 从小白到区块链工程师:第一阶段:Go语言的HelloWorld初始(2)
  16. canvas跨域问题
  17. 英特尔Atom处理器出货一亿,庆祝上网本CPU三周岁
  18. 运行django代码报错ModuleNotFoundError: No module named 'myapp'如何解决
  19. 商用密码应用安全性评估量化评估规则(2021版)
  20. 政务服务一网通办建设方案(ppt)

热门文章

  1. weui-react项目实战新心得
  2. c# XML和实体类之间相互转换(序列化和反序列化)
  3. 甲骨文宣布供应链管理云平台支持LogFire仓库管理系统
  4. 导入BaiduMapSdkDemo报230错误解决思路
  5. PostgreSQL 的 target_list分析(五)
  6. 59、crontab用法简介
  7. 编译Linux 2.6内核
  8. TC字符界面-菜单程序【原创】
  9. 哎,最近心情非常烦乱!
  10. 去除代码行号的一个小程序(控制台版本)