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

.net网站 生成 发布网站
(图片来源网络,侵删)

核心概念:生成 vs. 发布

在开始之前,先理解两个关键概念的区别:

  1. 生成

    • 目的:在开发过程中,将你的源代码(.cs, .cshtml, .js 等)转换成可执行的中间语言代码(IL),并编译项目引用的所有依赖项。
    • 产物:一个在 bin/Debugbin/Release 目录下的可执行文件(YourWebApp.dll)和一些相关的配置文件。
    • 特点:这个版本通常包含调试信息,并且运行时依赖本地的 .NET SDK,它主要用于在本地电脑上运行和调试。
  2. 发布

    • 目的:为生产环境(服务器)准备一个完整的、独立的、可部署的应用程序包。
    • 产物:一个包含所有必要文件的文件夹,包括:
      • 编译后的应用程序代码(.dll 文件)。
      • 所有依赖项(.dll 文件)。
      • 静态文件(CSS, JS, 图片等)。
      • 配置文件(如 appsettings.json)。
      • 一个用于启动应用程序的可执行文件(YourWebApp.exe)。
    • 特点:这个版本是“自包含的”或“框架依赖的”,不依赖服务器上安装的完整 .NET SDK,它可以直接在服务器上运行。

第一部分:生成网站

生成网站通常是开发过程中的一个自动化步骤,当你按 F5 (运行) 或 Ctrl+F5 (不调试运行) 时,Visual Studio 或 dotnet CLI 会自动为你完成生成。

.net网站 生成 发布网站
(图片来源网络,侵删)

使用 Visual Studio (推荐)

这是最简单直观的方式。

  1. 打开你的项目:在 Visual Studio 中打开你的 ASP.NET Core Web 项目。

  2. 选择构建配置:在 Visual Studio 顶部,确保选择的是 "Release" 配置,这会生成一个优化过的、不包含调试信息的版本,更适合发布。

  3. 生成项目

    .net网站 生成 发布网站
    (图片来源网络,侵删)
    • 菜单栏: 生成 -> 生成解决方案 (或按 Ctrl+Shift+B)。
    • 输出窗口:你会在底部的输出窗口中看到生成过程的日志,如果成功,会提示“生成成功”。
  4. 查看生成产物

    • 在解决方案资源管理器中,右键点击你的项目 -> 在文件资源管理器中打开文件夹
    • 进入 bin -> Release -> netX.0 (或你的目标框架版本) 文件夹。
    • 你会在这里找到编译好的 .dll 文件和 YourWebApp.exe,这就是你的生成产物。

使用命令行

如果你习惯使用终端,可以使用 .NET CLI。

  1. 打开终端:在项目根目录下打开命令提示符、PowerShell 或终端。
  2. 执行生成命令
    # 生成 Release 版本
    dotnet build --configuration Release
  3. 查看生成产物
    • 同样,产物会生成在 bin/Release/netX.0 目录下。

第二部分:发布网站

发布是为部署做准备,它将应用程序及其所有依赖项打包到一个文件夹中。

使用 Visual Studio (推荐)

  1. 打开发布向导

    • 在解决方案资源管理器中,右键点击你的项目 -> 发布
    • 或者,从顶部菜单栏选择 发布 -> 发布...
  2. 选择目标

    • Visual Studio 会打开一个发布向导窗口,这里有多种发布方式:
      • Azure App Service:直接发布到微软的云平台。
      • Azure Container Apps:发布为容器。
      • IIS, FTP/S, Web Deploy:发布到本地或远程的 IIS 服务器,或通过 FTP/SFTP 上传文件。
      • 文件夹这是最常用和最灵活的方式,它会将所有文件打包到一个指定的本地文件夹,然后你可以手动将这些文件上传到任何支持托管静态文件的服务器(如 Nginx, Apache, Kestrel 等)。
    • 选择 文件夹,然后点击 下一步
  3. 配置文件夹设置

    • 目标位置:选择一个本地文件夹来存放发布包。C:\publish\MyWebApp
    • 部署模式
      • 框架依赖:生成的应用程序会依赖目标服务器上已安装的 .NET 运行时,这会使部署包更小。
      • 自包含:生成的应用程序包含了运行所需的完整 .NET 运行时,这使得部署包更大,但可以在任何兼容的操作系统上运行,无需预先安装 .NET。对于初学者和大多数情况,推荐使用“自包含”模式,因为它简化了服务器环境的配置。
    • 目标运行时:选择你的服务器操作系统对应的运行时,win-x64 (Windows 64位), linux-x64 (Linux 64位), osx-x64 (macOS 64位)。
    • 文件发布选项:确保勾选了 删除目标文件夹中的额外文件,这可以确保每次发布都是干净的。
    • 点击 下一步
  4. 完成发布

    • 检查摘要信息,然后点击 完成
    • Visual Studio 会开始构建并发布你的应用程序,完成后,你可以在你指定的目标位置(如 C:\publish\MyWebApp)看到完整的发布包。

使用命令行

命令行方式更灵活,适合自动化脚本。

  1. 打开终端:在项目根目录下打开终端。

  2. 执行发布命令

    • 使用 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 文件夹。
  3. 查看发布产物

    • 执行完毕后,你会在 ./publish 文件夹中找到完整的发布包,其内容与 Visual Studio 生成的完全一致。

第三部分:在服务器上运行已发布的网站

现在你有了发布包,下一步就是在服务器上让它运行起来。

选项1:直接运行 (适合测试)

最简单的方式是直接在服务器上运行发布包里的可执行文件。

  1. 将发布包上传到服务器:使用 scp, rsync, WinSCP 或任何文件传输工具,将整个发布文件夹(publish 文件夹)上传到你的服务器。

  2. 在服务器上执行

    • 打开服务器的终端(Linux/macOS)或命令提示符/PowerShell(Windows)。

    • cd 到你上传的发布包目录。

    • 运行应用程序:

      # 对于 Windows
      YourWebApp.exe
      # 对于 Linux/macOS
      ./YourWebApp
  3. 访问网站:打开浏览器,访问 http://<你的服务器IP>:<端口号>(默认端口通常是 5000 或 5001)。

注意:这种方式是控制台应用程序,终端窗口关闭后,网站就会停止。不适合生产环境

选项2:使用反向代理 (生产环境推荐)

在生产环境中,我们通常使用一个专业的反向代理服务器(如 NginxApache)来接收外部请求,然后转发给我们的 .NET 应用程序,这样做的好处是:

  • 处理静态文件和负载均衡:Nginx/Apache 更擅长处理静态资源。
  • HTTPS 终止:在反向代理上配置 SSL 证书,而不是在 .NET 应用里。
  • 进程管理:使用 systemd (Linux) 或 IIS (Windows) 来管理应用程序的生命周期,确保它自动重启。

以 Nginx 为例 (Linux 环境):

  1. 安装 Nginx:

    sudo apt update
    sudo apt install nginx
  2. 配置 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;
        }
    }
  3. 启用配置并重启 Nginx:

    sudo ln -s /etc/nginx/sites-available/mywebapp /etc/nginx/sites-enabled/
    sudo nginx -t # 测试配置是否正确
    sudo systemctl restart nginx
  4. 使用进程管理器运行 .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 项目,流程有所不同:

  1. 生成

    • 在 Visual Studio 中生成项目,产物是 bin/Release 下的 .dll 文件。
    • 它依赖于服务器上安装的 .NET Framework 运行时。
  2. 发布

    • 方法:在 Visual Studio 中右键项目 -> 发布
    • 目标:通常选择 文件系统
    • 关键设置
      • 配置:选择 Release
      • 目标框架:确保选择 .NET Framework 的版本。
      • 在发布前删除所有现有文件:勾选。
    • 产物:一个文件夹,包含 .dll 文件、Web.config、Views、Scripts、CSS 等所有网站文件。
  3. 部署

    • 将整个发布文件夹的内容复制到 IIS (Internet Information Services) 的网站根目录下。
    • 在 IIS 管理器中创建一个新的网站或应用程序池,并指向这个文件夹。
    • 这种部署方式严重依赖 Windows 和 IIS。
步骤 .NET Core / .NET 5+ .NET Framework
生成 dotnet build 或 VS 生成 VS 生成 (生成 .dll)
发布 dotnet publish 或 VS 发布 (选择 文件夹 模式) VS 发布 (选择 文件系统 模式)
部署 上传发布包,使用 Kestrel + Nginx/ApacheIIS 上传文件到 IIS 网站目录

对于新的 .NET 项目,强烈推荐使用 .NET Core / .NET 5+跨平台 的部署方式,因为它更现代、更灵活、性能也更好。