Docker最全教程之使用.NET Core推送釘釘消息(十九)

前言

上一篇我們通過(guò)實(shí)戰(zhàn)分享了使用Go推送釘釘消息,由于技癢,筆者現(xiàn)在也編寫(xiě)了一個(gè).NET Core的Demo誓焦,作為簡(jiǎn)單的對(duì)照和說(shuō)明。

最后着帽,由于精力有限杂伟,筆者希望有興趣的朋友可以分享下使用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來(lái)完成相關(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)的主體代碼:


獲取參數(shù)


從環(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)

? ? ? {

? ? ? ? ? ? varconfig = newConfigurationBuilder()

? ? ? ? ? ? ? ? ? ? ? ? //支持命令行參數(shù)? ? ? ? ? ? ? ? ? ? ? ? .AddCommandLine(args)

? ? ? ? ? ? ? ? ? ? ? ? //支持環(huán)境變量? ? ? ? ? ? ? ? ? ? ? .AddEnvironmentVariables()

? ? ? ? ? ? ? ? ? ? ? ? .Build();

? ? ? ? ? ? #region參數(shù)檢查

? ? ? ? ? ? foreach(varenvNamein EnvList)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? varvalue =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;

? ? ? ? ? ? }

? ? ? ? ? ? #endregiontry? ? ? ? ? ? {

? ? ? ? ? ? ? ? //推送消息? ? ? ? ? ? ? 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)

? ? ? {

? ? ? ? ? ? varat =new? ? ? ? ? ? {

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

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

? ? ? ? ? ? };

? ? ? ? ? ? switch(config["MSG_TYPE"])

? ? ? ? ? ? {

? ? ? ? ? ? ? ? case"text":

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? vardata =new? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? Msgtype ="text",

? ? ? ? ? ? ? ? ? ? ? ? ? ? Text =new? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Content =config["MESSAGE"]

? ? ? ? ? ? ? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? ? ? ? ? ? ? At = at

? ? ? ? ? ? ? ? ? ? ? ? };

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

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? case"markdown":

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? vardata =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庫(kù)來(lái)發(fā)送Post請(qǐng)求。

在數(shù)據(jù)格式這塊尼变,我們通過(guò)配置做了以下設(shè)置:

忽略Null值利凑。也就是為null的屬性不做JSON序列化浆劲。

設(shè)置屬性命名規(guī)則為Camel-Case駝峰式命名法,首字母小寫(xiě)哀澈。


主體代碼如下所示:

///<summary>///調(diào)用webhook

? ? ? ///</summary>///<typeparamname="T"></typeparam>///<param name="url">webhook地址</param>///<param name="data">消息</param>///<returns></returns>? ? ? privatestaticasync Task SendWebhooks(stringurl, T data)whereT :class? ? ? {

? ? ? ? ? ? JsonConvert.DefaultSettings = newFunc(() =>newJsonSerializerSettings()

? ? ? ? ? ? {

? ? ? ? ? ? ? ? NullValueHandling =NullValueHandling.Ignore,

? ? ? ? ? ? ? ? ContractResolver = newCamelCasePropertyNamesContractResolver()

? ? ? ? ? ? });

? ? ? ? ? ? varjsonData =JsonConvert.SerializeObject(data);

? ? ? ? ? ? Console.WriteLine(jsonData);

? ? ? ? ? ? using(varhttpClient =new HttpClient())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? varcontent = newStringContent(jsonData);

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

? ? ? ? ? ? ? ? varresult = awaithttpClient.PostAsync(url, content);

? ? ? ? ? ? ? result.EnsureSuccessStatusCode();

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

? ? ? ? ? ? }

? ? ? }


設(shè)置Dockerfile

在之前我們已經(jīng)講述過(guò)牌借,使用了分階段構(gòu)建。整個(gè)Dockerfile基本上使用VS Docker tool生成:

FROMmicrosoft/dotnet:2.2-runtime ASbaseWORKDIR /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 命令來(lái)查看

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"}\

? ? ? ? ]\

? ? }'


編譯完成后丈氓,我們來(lái)查看下鏡像大兄苎:

注意:

通過(guò)上圖我們可以看到,鏡像大小不到200M万俗,相比GO體重大了許多湾笛,但是相比其他語(yǔ)言卻輕了不少。不過(guò)闰歪,我們可以通過(guò)官方開(kāi)源庫(kù)CoreRT將.NET Core編譯成機(jī)器代碼迄本,也就是.NET Core也可以做到編譯完成后只有幾M大小。有興趣的朋友可以分享下這塊的實(shí)踐课竣。


運(yùn)行并設(shè)置環(huán)境變量推送消息

我們使用PowerShell編寫(xiě)簡(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


效果如圖:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市于樟,隨后出現(xiàn)的幾起案子公条,更是在濱河造成了極大的恐慌,老刑警劉巖迂曲,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靶橱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡路捧,警方通過(guò)查閱死者的電腦和手機(jī)关霸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杰扫,“玉大人队寇,你說(shuō)我怎么就攤上這事≌滦眨” “怎么了佳遣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵识埋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我零渐,道長(zhǎng)窒舟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任诵盼,我火速辦了婚禮惠豺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘风宁。我一直安慰自己洁墙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布杀糯。 她就那樣靜靜地躺著扫俺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪固翰。 梳的紋絲不亂的頭發(fā)上狼纬,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音骂际,去河邊找鬼疗琉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛歉铝,可吹牛的內(nèi)容都是我干的盈简。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼太示,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柠贤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起类缤,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤臼勉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后餐弱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宴霸,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年膏蚓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓢谢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驮瞧,死狀恐怖氓扛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剧董,我是刑警寧澤幢尚,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布破停,位于F島的核電站翅楼,受9級(jí)特大地震影響尉剩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毅臊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一理茎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧管嬉,春花似錦皂林、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至胎挎,卻和暖如春沟启,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犹菇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工德迹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揭芍。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛔溃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砌烁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Docker和ASP.NET Core Docker正在逐漸成為容器行業(yè)的事實(shí)標(biāo)準(zhǔn),受到Windows和Linux...
    雪雁閱讀 2,320評(píng)論 2 24
  • 伯凡日知錄中:一個(gè)很老的笑話姑原,說(shuō)一個(gè)人理想的女朋友悬而,要像趙薇一樣的大眼睛,像朱莉婭·羅伯茨一樣的大嘴页衙,愛(ài)運(yùn)動(dòng)摊滔、會(huì)游...
    gyl58365閱讀 196評(píng)論 0 0
  • 下午我特別特別激動(dòng)艰躺,因?yàn)槲乙W(xué)書(shū)法,上學(xué)的時(shí)候我就想去了呢眨八,因?yàn)闀r(shí)間不對(duì)腺兴,所以只能寒假去學(xué)了,今天終于能去了...
    晨好寶貝口述日記閱讀 191評(píng)論 0 0
  • 車(chē)在十字路口轉(zhuǎn)了個(gè)方向 和開(kāi)頭一樣 相同的畫(huà)面讓我以為 電影才剛開(kāi)始 實(shí)際上片中的男主角 經(jīng)歷了由生到死 又由死到...
    阿鋇釘閱讀 159評(píng)論 0 1
  • 生物科技公司研究員盧克·李(吳尊 飾)深入一座古墓隨即失去音訊廉侧,劇毒生物學(xué)博士嘉·李(李冰冰 飾)得知弟弟盧克失蹤...
    池恩琛閱讀 214評(píng)論 0 3