Docker最全教程之使用.NET Core推送钉钉消息(二十)
上一篇我們通過實(shí)戰(zhàn)分享了使用Go推送釘釘消息,由于技癢,筆者現(xiàn)在也編寫了一個(gè).NET Core的Demo,作為簡(jiǎn)單的對(duì)照和說明。
最后,由于精力有限,筆者希望有興趣的朋友可以分享下使用CoreRT將.NET Core編譯成機(jī)器代碼這塊的實(shí)踐。
目錄
使用.NET Core推送釘釘消息
獲取參數(shù)
設(shè)置消息數(shù)據(jù)格式
發(fā)送請(qǐng)求
設(shè)置Dockerfile
運(yùn)行并設(shè)置環(huán)境變量推送消息
使用.NET Core推送釘釘消息
這里我們使用.NET Core來完成相關(guān)需求,注意,這里是.NET Core,而不是ASP.NET Core。需求和上面類似,工程相關(guān)依賴如下所示:
??? <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"/>
?
以下是相關(guān)的主體代碼:
從環(huán)境變量或者命令行參數(shù)獲取配置:
???????///<summary>
???????///環(huán)境變量列表
???????///</summary>
???????privatestaticreadonlystring[] EnvList =
???????{
??????????? //釘釘機(jī)器人地址
??????????? "WEBHOOK",
??????????? //@的手機(jī)號(hào)碼
??????????? "AT_MOBILES",
??????????? //@所有人
??????????? "IS_AT_ALL",
???????????//消息內(nèi)容
??????????? "MESSAGE",
??????????? //消息類型(僅支持文本和markdown)
??????????? "MSG_TYPE"
???????};
?
???????privatestaticvoid Main(string[] args)
???????{
??????????? var config = newConfigurationBuilder()
??????????????????????? //支持命令行參數(shù)
??????????????????????? .AddCommandLine(args)
??????????????????????? //支持環(huán)境變量
???????????????????????.AddEnvironmentVariables()
??????????????????????? .Build();
??????????? #region參數(shù)檢查
??????????? 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("必須設(shè)置參數(shù) AT_MOBILES 和 IS_AT_ALL 兩者之一!");
??????????????? return;
??????????? }
??????????? #endregion
??????????? try
??????????? {
??????????????? //推送消息
???????????????SetDataAndSendWebhooks(config).Wait();
??????????? }
??????????? catch (Exception ex)
???????????{
???????????????Console.WriteLine(ex.ToString());
??????????? }
???????}
?
設(shè)置消息數(shù)據(jù)格式設(shè)置消息格式,為了簡(jiǎn)單,這里我們使用匿名類:
???????///<summary>
???????///設(shè)置消息并調(diào)用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;
??????????????????? }
??????????? }
???????}
?
發(fā)送請(qǐng)求此處代碼使用Newtonsoft.Json做JSON序列化,然后使用Microsoft.Extensions.Http的HttpClient庫來發(fā)送Post請(qǐng)求。
在數(shù)據(jù)格式這塊,我們通過配置做了以下設(shè)置:
忽略Null值。也就是為null的屬性不做JSON序列化。
設(shè)置屬性命名規(guī)則為Camel-Case駝峰式命名法,首字母小寫。
?
主體代碼如下所示:
???????///<summary>
???????///調(diào)用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}");
??????????? }
???????}
?
設(shè)置Dockerfile在之前我們已經(jīng)講述過,使用了分階段構(gòu)建。整個(gè)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"]
?
# 注意不要單獨(dú)使用 MAINTAINER 指令,MAINTAINER已被Label標(biāo)簽代替
LABEL MAINTAINER ="xinlai@xin-lai.com"
# LABEL指令用于將元數(shù)據(jù)添加到鏡像,支持鍵值對(duì)和JSON,我們可以使用 docker inspect 命令來查看
LABELDingtalkComponent='{\
??? "description": "使用釘釘發(fā)送通知消息.",\
??? "input": [\
??????? {"name": "WEBHOOK","desc": "必填, 釘釘機(jī)器人Webhook地址"},\
??????? {"name":"AT_MOBILES", "desc": "非必填,被@人的手機(jī)號(hào)"},\
??????? {"name":"IS_AT_ALL", "desc": "非必填,@所有人時(shí):true, 否則為:false"},\
??????? {"name": "MESSAGE","desc": "必填,自定義發(fā)送的消息內(nèi)容"},\
??????? {"name":"MSG_TYPE", "desc": "必填,自定義發(fā)送的消息類型,目前僅支持text和markdown"}\
??????? ]\
??? }'
編譯完成后,我們來查看下鏡像大小:
注意通過上圖我們可以看到,鏡像大小不到200M,相比GO體重大了許多,但是相比其他語言卻輕了不少。不過,我們可以通過官方開源庫CoreRT將.NET Core編譯成機(jī)器代碼,也就是.NET Core也可以做到編譯完成后只有幾M大小。有興趣的朋友可以分享下這塊的實(shí)踐。
我們使用PowerShell編寫簡(jiǎn)單腳本如下所示:
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發(fā)送釘釘消息。*" `
??? -e "IS_AT_ALL=true" `
??? -e "MSG_TYPE=markdown" `
??? -d dingtalk.net
?
效果如圖:
Docker最全教程——從理論到實(shí)戰(zhàn)(一)
Docker最全教程——從理論到實(shí)戰(zhàn)(二)
Docker最全教程——從理論到實(shí)戰(zhàn)(三)
Docker最全教程——從理論到實(shí)戰(zhàn)(四)
Docker最全教程——從理論到實(shí)戰(zhàn)(五)
Docker最全教程——從理論到實(shí)戰(zhàn)(六)
Docker最全教程——從理論到實(shí)戰(zhàn)(七)
Docker最全教程——從理論到實(shí)戰(zhàn)(八)? ??
Docker最全教程——從理論到實(shí)戰(zhàn)(九)
Docker最全教程之使用Tencent Hub來完成CI(十)Docker最全教程——數(shù)據(jù)庫容器化(十一)
Docker最全教程——數(shù)據(jù)庫容器化之持久保存數(shù)據(jù)(十二)
Docker最全教程——MongoDB容器化(十三)
Docker最全教程——Redis容器化以及排行榜實(shí)戰(zhàn)(十四)
Docker最全教程之Ubuntu下安裝Docker(十五)
Docker最全教程之樹莓派和Docker(十六)
Docker最全教程之使用TeamCity來完成內(nèi)部CI、CD流程(十七)
Docker最全教程之使用Docker搭建Java開發(fā)環(huán)境(十八)
Docker最全教程之Go實(shí)戰(zhàn),墻裂推薦(十九)
如果喜歡作者的文章,請(qǐng)關(guān)注“magiccodes”訂閱號(hào)以便第一時(shí)間獲得最新內(nèi)容。本文版權(quán)歸作者和湖南心萊信息科技有限公司共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
QQ群:
編程交流群<85318032>?
產(chǎn)品交流群<897857351>
長(zhǎng)沙線下技術(shù)社區(qū)已經(jīng)創(chuàng)建,有興趣者可以通過客服加群。接下來,我們會(huì)定期組織一些線下技術(shù)交流分享會(huì),以饗大家。
總結(jié)
以上是生活随笔為你收集整理的Docker最全教程之使用.NET Core推送钉钉消息(二十)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2017 无法连接到Web服务器“I
- 下一篇: ASP.NET Core 文件系统