网站开发空间小,网站备案麻烦吗,传奇页游排行榜,刀客源码前言上一篇我们通过实战分享了使用Go推送钉钉消息#xff0c;由于技痒#xff0c;笔者现在也编写了一个.NET Core的Demo#xff0c;作为简单的对照和说明。最后#xff0c;由于精力有限#xff0c;笔者希望有兴趣的朋友可以分享下使用CoreRT将.NET Core编译成机器代码这块… 前言上一篇我们通过实战分享了使用Go推送钉钉消息由于技痒笔者现在也编写了一个.NET Core的Demo作为简单的对照和说明。最后由于精力有限笔者希望有兴趣的朋友可以分享下使用CoreRT将.NET Core编译成机器代码这块的实践。目录使用.NET Core推送钉钉消息获取参数设置消息数据格式发送请求设置Dockerfile运行并设置环境变量推送消息使用.NET Core推送钉钉消息这里我们使用.NET Core来完成相关需求注意这里是.NET Core而不是ASP.NET Core。需求和上面类似工程相关依赖如下所示 PackageReferenceIncludeMicrosoft.Extensions.ConfigurationVersion2.2.0/ PackageReferenceIncludeMicrosoft.Extensions.Configuration.CommandLineVersion2.2.0/ PackageReferenceIncludeMicrosoft.Extensions.Configuration.EnvironmentVariablesVersion2.2.0/ PackageReferenceIncludeMicrosoft.Extensions.HttpVersion2.2.0/ PackageReferenceIncludeNewtonsoft.JsonVersion12.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 nameconfig/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]) { casetext: { var data new { Msgtype text, Text new { Content config[MESSAGE] }, At at }; awaitSendWebhooks(config[WEBHOOK], data); break; } casemarkdown: { 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 ///typeparamnameT/typeparam ///param nameurlwebhook地址/param ///param namedata消息/param ///returns/returns privatestaticasync Task SendWebhooksT(string url, T data) where T : class { JsonConvert.DefaultSettings newFuncJsonSerializerSettings(() 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 baseWORKDIR /app FROMmicrosoft/dotnet:2.2-sdk AS buildWORKDIR /srcCOPY DingTalk.NET/DingTalk.NET.csprojDingTalk.NET/RUN dotnet restoreDingTalk.NET/DingTalk.NET.csprojCOPY . .WORKDIR /src/DingTalk.NETRUN dotnet buildDingTalk.NET.csproj -c Release -o /app FROM build AS publishRUN dotnet publish DingTalk.NET.csproj-c Release -o /app FROM base AS finalWORKDIR /appCOPY --frompublish/app .ENTRYPOINT [dotnet, DingTalk.NET.dll] # 注意不要单独使用 MAINTAINER 指令MAINTAINER已被Label标签代替LABEL MAINTAINER xinlaixin-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 -eWEBHOOKhttps://oapi.dingtalk.com/robot/send?access_token{yourAccess Token} -e MESSAGE*使用.NET Core发送钉钉消息。* -e IS_AT_ALLtrue -e MSG_TYPEmarkdown -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长沙线下技术社区已经创建有兴趣者可以通过客服加群。接下来我们会定期组织一些线下技术交流分享会以飨大家。