基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
作者:陆冬澄、周静
在现代软件研发体系中,.NET 平台由于其强大的功能、灵活性和丰富的开发工具,成为了构建 Windows 应用程序的热门选择。无论是桌面应用、Web 应用还是服务应用,.NET 提供了一系列强大的框架和工具,帮助开发者高效的创建高性能、可靠的应用程序。
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
方案架构
本次实战教程中准备了两台机器,一台是用于构建的 Windows 构建机,需要我们添加到 Flow 流水线中;另一台是 Windows Server,作为 msdeploy 的对象,用于部署 .NET 应用服务。整体架构如下:

本方案中用到的示例代码工程如下:
- https://atomgit.com/oauth2_o72n54/FlowDemoWin
- https://atomgit.com/oauth2_o72n54/PackagesDemo (添加了 using Newtonsoft.Json 依赖。)
环境准备
2.1 在 Windows Server 上安装和配置 Web deploy
2.1.1 开启 IIS 服务
IIS(Internet Information Server)服务类似于 Java 的 Tomcat,类似于一种容器,我们能将我们开发好的 Web 应用部署到 IIS 中。
按照以下流程开启 IIS:
-
打开 Server Manager。
-
在 Manage 菜单下,选择 Add Roles and Features。

- 选择 Role-based or Feature-based Installation。

-
在 Server Selection 中选择合适的机器,此处可以选择默认的本地机器。
-
在 Server Roles 中选择 Webserver(IIS),并请务必同时勾选 IIS Management Scripts and Tools、Management Service 和 IIS Management Console 三个选项,否则安装 web deploy 时无法看到全部选项。

-
Features 可以不用选择,因为 IIS 不需要额外的 Features。
-
在 IIS Role Service 中选择想要的设定,也可以保留默认设定。

- 点击 installation 进行安装,安装完成后点击 Close 关闭。

2.1.2 安装 Web Deploy
-
下载 Web deploy 4.0 [ 1]
-
运行下载的安装程序,请注意,请务必选择全部安装而非典型安装。如果我们选择自定义安装,可以看到以下页面,我们需要安装其中的所有组件。如果安装选项比起下图有缺少,说明之前安装 IIS 中少安装了 Management 相关组件,需要重新 Add Roles and Features。

3.(可选)通过打开“控制面板”>“系统和安全”>“管理工具”>“服务”来验证 Web 部署是否正确运行,然后确保:
- “Web 部署代理服务”正在运行(旧版本中的服务名称不同)。
- “Web 管理服务”正在运行。
如果某个代理服务未运行,请重新启动“Web 部署代理服务”。
如果 Web 部署代理服务根本不存在,请转到“控制面板”>“程序”>“卸载程序”,查找“Microsoft Web 部署 <版本>。选择“更改”安装,并确保对 Web 部署组件选择“将安装到本地硬盘”。完成更改安装步骤。
2.1.3 安装 ASP.NET Core windows-hosting-bundle
我们需要安装 AspNetCoreModuleV2 来确保服务的顺利启动。如果不安装该组件,那么服务启动的时候就会报 500.19 错误。下载 windows-hosting-bundle [ 2] , 并运行安装程序。
2.1.4 添加 Web 网站并开启 Web Deploy 发布功能**
- 打开 IIS 管理器,在左侧选择 Add Website。


- 在打开的 Website 窗口中,填写 Site name 和 Physical path,然后点击 ok。此处 Site name 填写为 DemoWin。

- 右键点击刚刚创建的 Web 网站,选择 Deploy > Config Web Deploy Publishing。

如果没有 Deploy 这一个选项,说明之前的 Web Deploy 没有正确安装和运行。
- 检查弹出页面中的各项参数,默认 URL for publishing seriver connection 端口为 8172,我们可以保留这个端口,也可以修改为其他端口。URL 中的 host name(8172 之前的部分)可以不用修改,在构建机中 deploy 时,我们将用 IP 地址代替 host name。

5.(可选)如果 Windows Server 位于阿里云 ECS,我们需要打开防火墙,允许外部对于 Server 的 8172、80端口的访问。操作路径:到 ECS 控制台 > 选择实例 > Windows Server 对应的实例 > 安全组 > 入方向手动添加,端口选择 80 和 8172, 授权对象选【0.0.0.0/0】。
2.2 配置 Windows 构建机
2.2.1 安装构建工具和发布工具
安装 Visual Studio、Web Deploy 和 Dotnet6.0。注意,本处安装 web deploy 时不需要打开 IIS,所以安装界面中会比 1.2 中少一些安装选项,但这不会影响我们配置构建机。
安装完成后,将以下路径添加到 Path 中:
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319
- C:\Program Files\IIS\Microsoft Web Deploy V3
dotnet 对应的 path 在安装时已经添加,如果没有找到 dotnet,可以手动添加:
- C:\Program Files\dotnet
安装结束以后,我们可以到 cmd 中尝试一下 msbuild、msdeploy、dotnet 命令是否成功安装和添加到 Path。
2.2.2 在本地构建 Demo 工程并发布
在配置流水线之前,我们可以先在本地尝试是否能成功构建并发布工程。1. 首先,我们 Clone Demo 工程代码:
git clone https://atomgit.com/oauth2_o72n54/FlowDemoWin
- 构建工程:
# mubuild 构建
dotnet msbuild /p:Configuration=Debug /t:Publish
# /p:Configuration=Debug 是构建出Debug版本
- 使用 msdeploy,将构建出来的内容发布到 Windows Server。
msdeploy -verb:sync -source:contentPath="C:\Users\Administrator\source\repos\FlowDemoWin\bin\Debug\net6.0\publish" -dest:contentPath=DemoWin,computerName=https://<Windows Server IP>:8172/MsDeploy.axd?site=DemoWin,userName=YOURUSERNAME,password=YOURPASSWORD,authtype="Basic",includeAcls="False" -allowUntrusted -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -verbose# 上述 <Windows Server IP> 请替换为 Windows Server 的 IP# -source:contentPath 用于指定需要发布的路径,这里的路径是上文中dotnet msbuild以后的output路径
#-dest:contentPath 用于指定目标机器和站点:这里我们的站点为DemoWin
- 在浏览器输入 Windows Server 的公网 IP,我们可以看到:

这说明我们在本地成功构建并发布 Demo 工程。
基于云效 Windows 构建环境和 Nuget 制品仓库实现 .NET 应用持续交付
3.1 在 Flow 中添加 Windows 私有构建机
进入流水线管理页面后,点击最左下角的设置,然后点击构建集群管理 > 新建构建集群,输入构建集群基本信息后,点击确定创建私有构建集群后自动进入构建机的配置页面。

点击接入新节点 > 选择类型 Windows > 复制红框中 Runner 安装命令,粘贴到准备好的 Windows 构建机的 powershell 进行执行。

Runner 安装命令执行成功后,刷新私有构建集群页面,即可看到刚才接入的构建机器。

3.2 配置 Flow 流水线
进入 Flow 首页,新建流水线,按如下配置编辑流水线配置。
- 添加流水线源:我们可以选择企业公钥连接,然后将企业公钥粘贴至代码仓库的 SSH Key 处。
git@atomgit.com:oauth2_o72n54/FlowDemoWin.git

- 添加步骤:构建。选择刚才添加的 Windows 构建机,选择 Windows 节点,然后我们添加一个任务步骤-执行命令,然后写入:
dotnet msbuild /p:Configuration=Debug /t:Publish


- 添加步骤:部署。创建一个新的任务,选择类型为“执行命令”。然后依旧选择上一步中的 Windows 构建机,在执行命令中可以填入:
# input your command here$PUBLISH_BASE = (Get-Item .).FullName | Out-String
$PUBLISH_PATH = Join-Path -Path $PUBLISH_BASE.Trim() -ChildPath "bin\Debug\net6.0\publish"& 'C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy' -verb:sync -source:contentPath=${PUBLISH_PATH} -dest:contentPath=DemoWin,computerName=https://<Windows Server IP>:8172/MsDeploy.axd?site=DemoWin,userName=YOURUSERNAME,password=YOUPASSWORD,authtype="Basic",includeAcls="False" -allowUntrusted -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -verbose# 上述 <Windows Server IP> 请替换为 Windows Server 的 IP
请注意,由于 runner 的 Path 可能和 Administrator 用户的 Path 有所不同,所以我们可以在这里详细写出 msdeploy 的路径 & ‘C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy’。

- 保存并执行流水线,查看流水线运行进度。

- 流水线运行成功后,打开 Windows Server 中站点,我们可以看到应用部署成功。

3.3 使用 Packages Nuget 制品仓库进行依赖管理
将原来的代码源换为 https://atomgit.com/oauth2_o72n54/PackagesDemo ,相较于原来的代码,该仓库添加了 using Newtonsoft.Json;,此时,再运行流水线构建任务 msbuild 会失败,因为缺少依赖包。
我们可以用云效 packages,创建一个 NuGet 制品库来管理二方制品和三方制品。进入云效 Packages 首页,新建一个 NuGet 制品仓库。

访问官网 [ 3] ,下载依赖的 nuget 包到本地。

按照仓库指南,在本地进行配置:首先在本地设置仓库凭证,然后将刚才从官网下载的 nuget 包 push 到仓库中。此处 <SOURCE_NAME> 即为仓库地址的后缀名 repo-xxxxx。

推送成功后可以在仓库-包列表中查看包:

修改流水线代码源为(该仓库添加了 using Newtonsoft.Json):
git@atomgit.com:oauth2_o72n54/PackagesDemo.git
修改流水线构建任务命令为:
# 配置 nuget 仓库凭证
dotnet nuget add source http://yunxiao-poc.devops.aliyuncs.com:80/packages/02e873bb-f911-48ac-ad73-ec2298c5385d/nuget/repo-hzaul/index.json -n repo-hzaul -u "xxxxxxxxxxx" -p "xxxxxxxxx"# 拉取 nuget 依赖包
dotnet add package Newtonsoft.Json --source http://yunxiao-poc.devops.aliyuncs.com:80/packages/02e873bb-f911-48ac-ad73-ec2298c5385d/nuget/repo-hzaul/index.json# mubuild 构建
dotnet msbuild /p:Configuration=Debug /t:Publish
保存后运行流水线,流水线构建任务即会从 Packages NuGet 制品仓库拉取 Newtonsoft.Json 包,完成应用构建。
至此,本文即完成了一个 .NET 应用开发环境的搭建、CI/CD 流水线的配置、NuGet 依赖仓库管理等完整流程实践。
相关链接:
[1] Web deploy 4.0
https://download.visualstudio.microsoft.com/download/pr/e1828da1-907a-46fe-a3cf-f3b9ea1c485c/035860f3c0d2bab0458e634685648385/webdeploy_amd64_en-us.msi
[2] windows-hosting-bundle
https://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/runtime-aspnetcore-6.0.20-windows-hosting-bundle-installer
[3] 官网
https://www.nuget.org/packages/Newtonsoft.Json
相关阅读:
云效 Flow 私有构建集群
https://help.aliyun.com/zh/yunxiao/user-guide/build-a-cluster
云效 Packages NuGet 制品仓库
https://help.aliyun.com/zh/yunxiao/user-guide/product-management-3
相关文章:
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
作者:陆冬澄、周静 在现代软件研发体系中,.NET 平台由于其强大的功能、灵活性和丰富的开发工具,成为了构建 Windows 应用程序的热门选择。无论是桌面应用、Web 应用还是服务应用,.NET 提供了一系列强大的框架和工具,帮…...
Backend - C# asp .net core
目录 一、各大框架理解 (一)ASP.NET Core (二)ASP.NET Core Web Application (三)ASP.NET Core MVC (四)ASP.NET Core Web API (五)ASP.NET Core 和 EF …...
【合作原创】使用Termux搭建可以使用的生产力环境(九)
前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境(八)-CSDN博客中我们讲到了如何安装IDEA社区版,并在Termux中安装VNC服务器,在proot-distro的Debian中启动xfce桌面,并通过这个方式解决了IDEA社区版中无…...
使用Supervisor在Ubuntu中实现后台自启动服务
在Ubuntu系统中,Supervisor是一个非常实用的进程管理工具,它可以让你的应用程序在后台运行,并且在系统启动时自动启动这些应用程序。下面,我将详细介绍如何在Ubuntu中使用Supervisor来实现后台自启动服务,并以一个具体…...
AIDD-人工智能药物设计-人工智能驱动的罕见病药物发现
JCIM | 人工智能驱动的罕见病药物发现 **罕见病(Rare Diseases,RDs)**是全球公共卫生领域的重大挑战,其特点是疾病种类繁多、症状复杂且诊断困难。尽管过去几十年出台了如《孤儿药法案》等法规推动研发,但超过90%的罕…...
安卓硬件加速hwui
安卓硬件加速 本文基于安卓11。 从 Android 3.0 (API 级别 11) 开始,Android 2D 渲染管道支持硬件加速,这意味着在 View 的画布上执行的所有绘图操作都使用 GPU。由于启用硬件加速所需的资源增加,你的应用程序将消耗更多内存。 软件绘制&am…...
TDv2:一种用于离线数学表达式识别的新型树形结构解码器
TDv2:一种用于离线数学表达式识别的新型树形结构解码器 本文提出了一种针对手写数学表达式识别(HMER)任务的新型树形解码器(TDv2) ,旨在充分利用数学表达式的树结构标签进行更有效的建模和预测。相较于传统的LaTeX字符串解码器,该模型通过采用一个节点分类模块和一个分…...
Golang学习笔记_23——error补充
Golang学习笔记_20——error Golang学习笔记_21——Reader Golang学习笔记_22——Reader示例 文章目录 error补充1. 基本错误处理2. 自定义错误3. 错误类型判断3.1 类型断言3.2 类型选择 4. panic && recover 源码 error补充 1. 基本错误处理 在Go中,函数…...
邯郸地标美食导游平台的设计与实现
标题:邯郸地标美食导游平台的设计与实现 内容:1.摘要 摘要:本文介绍了邯郸地标美食导游平台的设计与实现。该平台旨在为游客提供邯郸地标美食的详细信息和导航服务,帮助游客更好地了解和品尝邯郸的特色美食。文章首先介绍了项目的背景和目的,…...
滑动窗口限流算法:基于Redis有序集合的实现与优化
滑动窗口限流算法是一种基于时间窗口的流量控制策略,它将时间划分为固定大小的窗口,并在每个窗口内记录请求次数。通过动态滑动窗口,算法能够灵活调整限流速率,以应对流量的波动。 算法核心步骤 统计窗口内的请求数量࿱…...
Angular 最新版本和 Vue 对比完整指南
1. Angular 最新版本 当前 Angular 最新稳定版本是 Angular 17(2024年初) 2. 主要区别对比表 特性 | Angular | Vue 框架类型 | 完整框架 | 渐进式框架 默认语言 | TypeScript | JavaScript/TypeScript 数据处理 | RxJS | Promise/async/await 架构特点 | 依赖注入,…...
DAY39|动态规划Part07|LeetCode:198.打家劫舍、213.打家劫舍II、337.打家劫舍III
目录 LeetCode:198.打家劫舍 基本思路 C代码 LeetCode:213.打家劫舍II 基本思路 C代码 LeetCode:337.打家劫舍III 基本思路 C代码 LeetCode:198.打家劫舍 力扣题目链接 文字讲解:LeetCode:198.打家劫舍 视频讲解:动态规划,偷不偷这个…...
MYSQL----------------sql 优化
优化 SQL 语句的一般步骤 1. 了解 SQL 的执行频率 SHOW STATUS LIKE Com_%;代码解释: SHOW STATUS LIKE Com_%;:此命令可以查看各种 SQL 语句的执行频率,例如 Com_select 表示 SELECT 语句的执行次数,Com_insert 表示 INSERT 语…...
深度学习中的正则化方法
最近看到了正则化的内容,发现自己对正则化的理解已经忘得差不多了,这里在整理一下,方便以后查阅。 深度学习中的正则化方法 1. L2 正则化(L2 Regularization)2. L1 正则化(L1 Regularization)3.…...
前端报告 2024:全新数据,深度解析未来趋势
温馨提示: 此报告为国际版全球报告,其中所涉及的技术应用、工具偏好、开发者习惯等情况反映的是全球前端开发领域的综合态势。由于国内外技术发展环境、行业生态以及企业需求等存在差异,可能有些内容并不完全契合国内的实际情况,请大家理性阅读,批判性地吸收其中的观点与信…...
计算机网络之---子网划分与IP地址
子网划分与IP地址的关系 在计算机网络中,子网划分(Subnetworking)是将一个网络划分为多个子网络的过程。通过子网划分,可以有效地管理和利用IP地址空间,提高网络的性能、安全性和管理效率。 子网划分的基本目的是通过…...
计算机网络 (31)运输层协议概念
一、概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。运输层的一个核心功能是提供从源端主机到目的端主机的可靠的、与实际使用的网络无关的信息传输。它向高层用…...
代码随想录算法训练营day28
代码随想录算法训练营 —day28 文章目录 代码随想录算法训练营前言一、122.买卖股票的最佳时机II二、55. 跳跃游戏三、跳跃游戏 II方法一方法二 1005. K 次取反后最大化的数组和总结 前言 今天是算法营的第28天,希望自己能够坚持下来! 今日任务&#x…...
建立时间和保持时间
建立时间 在时钟有效沿到来之前,数据必须维持一段时间保持不变,这段时间就是建立时间 Tsetup 1 基本概念 建立时间(Setup Time): 在 SystemVerilog 中,建立时间是指在时钟信号的有效边沿(例如…...
vue,router路由传值问题,引用官方推荐
参考贴https://blog.csdn.net/m0_57033755/article/details/129927829 根据官方文档的更新日志,建议使用state传值 官方文档更新日志 实际的console结果 传值 router.push({ name: KnowledgeDetail, state: { params } });接收值 const historyParams histor…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
