我们将以目前最主流的 .NET 6/7/8 和 ASP.NET Core 为例进行说明,因为这是当前的标准实践,对于较旧的 .NET Framework (ASP.NET Web Forms/MVC),流程会有所不同,我也会在最后简要提及。

核心概念:生成 vs. 发布
在开始之前,先理解两个关键概念的区别:
-
生成
- 目的:在开发过程中,将你的源代码(
.cs,.cshtml,.js等)转换成可执行的中间语言代码(IL),并编译项目引用的所有依赖项。 - 产物:一个在
bin/Debug或bin/Release目录下的可执行文件(YourWebApp.dll)和一些相关的配置文件。 - 特点:这个版本通常包含调试信息,并且运行时依赖本地的 .NET SDK,它主要用于在本地电脑上运行和调试。
- 目的:在开发过程中,将你的源代码(
-
发布
- 目的:为生产环境(服务器)准备一个完整的、独立的、可部署的应用程序包。
- 产物:一个包含所有必要文件的文件夹,包括:
- 编译后的应用程序代码(
.dll文件)。 - 所有依赖项(
.dll文件)。 - 静态文件(CSS, JS, 图片等)。
- 配置文件(如
appsettings.json)。 - 一个用于启动应用程序的可执行文件(
YourWebApp.exe)。
- 编译后的应用程序代码(
- 特点:这个版本是“自包含的”或“框架依赖的”,不依赖服务器上安装的完整 .NET SDK,它可以直接在服务器上运行。
第一部分:生成网站
生成网站通常是开发过程中的一个自动化步骤,当你按 F5 (运行) 或 Ctrl+F5 (不调试运行) 时,Visual Studio 或 dotnet CLI 会自动为你完成生成。

使用 Visual Studio (推荐)
这是最简单直观的方式。
-
打开你的项目:在 Visual Studio 中打开你的 ASP.NET Core Web 项目。
-
选择构建配置:在 Visual Studio 顶部,确保选择的是 "Release" 配置,这会生成一个优化过的、不包含调试信息的版本,更适合发布。
-
生成项目:
(图片来源网络,侵删)- 菜单栏:
生成->生成解决方案(或按Ctrl+Shift+B)。 - 输出窗口:你会在底部的输出窗口中看到生成过程的日志,如果成功,会提示“生成成功”。
- 菜单栏:
-
查看生成产物:
- 在解决方案资源管理器中,右键点击你的项目 ->
在文件资源管理器中打开文件夹。 - 进入
bin->Release->netX.0(或你的目标框架版本) 文件夹。 - 你会在这里找到编译好的
.dll文件和YourWebApp.exe,这就是你的生成产物。
- 在解决方案资源管理器中,右键点击你的项目 ->
使用命令行
如果你习惯使用终端,可以使用 .NET CLI。
- 打开终端:在项目根目录下打开命令提示符、PowerShell 或终端。
- 执行生成命令:
# 生成 Release 版本 dotnet build --configuration Release
- 查看生成产物:
- 同样,产物会生成在
bin/Release/netX.0目录下。
- 同样,产物会生成在
第二部分:发布网站
发布是为部署做准备,它将应用程序及其所有依赖项打包到一个文件夹中。
使用 Visual Studio (推荐)
-
打开发布向导:
- 在解决方案资源管理器中,右键点击你的项目 ->
发布。 - 或者,从顶部菜单栏选择
发布->发布...。
- 在解决方案资源管理器中,右键点击你的项目 ->
-
选择目标:
- Visual Studio 会打开一个发布向导窗口,这里有多种发布方式:
- Azure App Service:直接发布到微软的云平台。
- Azure Container Apps:发布为容器。
- IIS, FTP/S, Web Deploy:发布到本地或远程的 IIS 服务器,或通过 FTP/SFTP 上传文件。
- 文件夹:这是最常用和最灵活的方式,它会将所有文件打包到一个指定的本地文件夹,然后你可以手动将这些文件上传到任何支持托管静态文件的服务器(如 Nginx, Apache, Kestrel 等)。
- 选择
文件夹,然后点击下一步。
- Visual Studio 会打开一个发布向导窗口,这里有多种发布方式:
-
配置文件夹设置:
- 目标位置:选择一个本地文件夹来存放发布包。
C:\publish\MyWebApp。 - 部署模式:
- 框架依赖:生成的应用程序会依赖目标服务器上已安装的 .NET 运行时,这会使部署包更小。
- 自包含:生成的应用程序包含了运行所需的完整 .NET 运行时,这使得部署包更大,但可以在任何兼容的操作系统上运行,无需预先安装 .NET。对于初学者和大多数情况,推荐使用“自包含”模式,因为它简化了服务器环境的配置。
- 目标运行时:选择你的服务器操作系统对应的运行时,
win-x64(Windows 64位),linux-x64(Linux 64位),osx-x64(macOS 64位)。 - 文件发布选项:确保勾选了
删除目标文件夹中的额外文件,这可以确保每次发布都是干净的。 - 点击
下一步。
- 目标位置:选择一个本地文件夹来存放发布包。
-
完成发布:
- 检查摘要信息,然后点击
完成。 - Visual Studio 会开始构建并发布你的应用程序,完成后,你可以在你指定的目标位置(如
C:\publish\MyWebApp)看到完整的发布包。
- 检查摘要信息,然后点击
使用命令行
命令行方式更灵活,适合自动化脚本。
-
打开终端:在项目根目录下打开终端。
-
执行发布命令:
- 使用
dotnet publish命令,并指定相关参数。 - 示例:发布为自包含的 Windows 64位应用程序
dotnet publish -c Release -r win-x64 --self-contained true -o ./publish
-c Release: 指定发布配置为 Release。-r win-x64: 指定目标运行时为 Windows 64位。--self-contained true: 指定为自包含模式。-o ./publish: 指定输出目录为项目下的publish文件夹。
- 使用
-
查看发布产物:
- 执行完毕后,你会在
./publish文件夹中找到完整的发布包,其内容与 Visual Studio 生成的完全一致。
- 执行完毕后,你会在
第三部分:在服务器上运行已发布的网站
现在你有了发布包,下一步就是在服务器上让它运行起来。
选项1:直接运行 (适合测试)
最简单的方式是直接在服务器上运行发布包里的可执行文件。
-
将发布包上传到服务器:使用
scp,rsync,WinSCP或任何文件传输工具,将整个发布文件夹(publish文件夹)上传到你的服务器。 -
在服务器上执行:
-
打开服务器的终端(Linux/macOS)或命令提示符/PowerShell(Windows)。
-
cd到你上传的发布包目录。 -
运行应用程序:
# 对于 Windows YourWebApp.exe # 对于 Linux/macOS ./YourWebApp
-
-
访问网站:打开浏览器,访问
http://<你的服务器IP>:<端口号>(默认端口通常是 5000 或 5001)。
注意:这种方式是控制台应用程序,终端窗口关闭后,网站就会停止。不适合生产环境。
选项2:使用反向代理 (生产环境推荐)
在生产环境中,我们通常使用一个专业的反向代理服务器(如 Nginx 或 Apache)来接收外部请求,然后转发给我们的 .NET 应用程序,这样做的好处是:
- 处理静态文件和负载均衡:Nginx/Apache 更擅长处理静态资源。
- HTTPS 终止:在反向代理上配置 SSL 证书,而不是在 .NET 应用里。
- 进程管理:使用
systemd(Linux) 或 IIS (Windows) 来管理应用程序的生命周期,确保它自动重启。
以 Nginx 为例 (Linux 环境):
-
安装 Nginx:
sudo apt update sudo apt install nginx
-
配置 Nginx: 创建一个新的配置文件,
/etc/nginx/sites-available/mywebapp:server { listen 80; server_name yourdomain.com; # 你的域名或服务器IP location / { # 将请求转发到运行在 Kestrel 上的 .NET 应用 proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } -
启用配置并重启 Nginx:
sudo ln -s /etc/nginx/sites-available/mywebapp /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置是否正确 sudo systemctl restart nginx
-
使用进程管理器运行 .NET 应用:
-
安装
systemd(通常已预装)。 -
创建一个服务文件
/etc/systemd/system/mywebapp.service:[Unit] Description=My Awesome Web App [Service] WorkingDirectory=/path/to/your/publish/folder ExecStart=/path/to/your/publish/folder/YourWebApp Restart=always RestartSec=10 User=www-data # 运行服务的用户 Environment=ASPNETCORE_ENVIRONMENT=Production Environment=ASPNETCORE_URLS=http://localhost:5000 [Install] WantedBy=multi-user.target
-
启动并启用服务:
sudo systemctl daemon-reload sudo systemctl start mywebapp sudo systemctl enable mywebapp
-
你的网站就可以通过 http://yourdomain.com 访问了,并且会自动在后台运行。
附录:针对旧版 .NET Framework (ASP.NET MVC/Web Forms) 的区别
如果你维护的是一个旧的 .NET Framework 项目,流程有所不同:
-
生成:
- 在 Visual Studio 中生成项目,产物是
bin/Release下的.dll文件。 - 它依赖于服务器上安装的 .NET Framework 运行时。
- 在 Visual Studio 中生成项目,产物是
-
发布:
- 方法:在 Visual Studio 中右键项目 ->
发布。 - 目标:通常选择
文件系统。 - 关键设置:
- 配置:选择
Release。 - 目标框架:确保选择
.NET Framework的版本。 - 在发布前删除所有现有文件:勾选。
- 配置:选择
- 产物:一个文件夹,包含
.dll文件、Web.config、Views、Scripts、CSS 等所有网站文件。
- 方法:在 Visual Studio 中右键项目 ->
-
部署:
- 将整个发布文件夹的内容复制到 IIS (Internet Information Services) 的网站根目录下。
- 在 IIS 管理器中创建一个新的网站或应用程序池,并指向这个文件夹。
- 这种部署方式严重依赖 Windows 和 IIS。
| 步骤 | .NET Core / .NET 5+ | .NET Framework |
|---|---|---|
| 生成 | dotnet build 或 VS 生成 |
VS 生成 (生成 .dll) |
| 发布 | dotnet publish 或 VS 发布 (选择 文件夹 模式) |
VS 发布 (选择 文件系统 模式) |
| 部署 | 上传发布包,使用 Kestrel + Nginx/Apache 或 IIS | 上传文件到 IIS 网站目录 |
对于新的 .NET 项目,强烈推荐使用 .NET Core / .NET 5+ 和 跨平台 的部署方式,因为它更现代、更灵活、性能也更好。
