第 2.1 部分 - 在 Linux 中创建和配置 ASP.NET Core应用程序

适用于: .NET Core 2.1、.NET Core 3.1、.NET 5

本文介绍如何在 Linux 中创建和配置 ASP.NET Core应用程序。

先决条件

若要遵循本部分中的练习,必须安装 .NET Core SDK。 若要安装 SDK,请根据需要参阅 第 1 部分中的安装说明。

此部分的目标

你将了解如何在 Linux 中使用 .NET Core 命令行接口 (CLI) 创建 ASP.NET Core Web 应用程序,以及如何将应用程序发布到 /var 目录。 了解这些概念后,你将练习一些基本任务,例如处理文件和文件夹,以及以特权用户身份运行命令。 你还将了解如何在 Linux 中使用 vi 文本编辑器编辑文件。

.NET CLI

根据此 .NET CLI 文档,.NET CLI 是用于开发、生成、运行和发布 .NET 应用程序的跨平台工具链。 .NET CLI 与 .NET SDK 一起安装。

这些训练经常使用 dotnet 命令。 此命令功能强大,具有两个main函数:

  • 它提供用于处理 .NET 项目的命令。 例如, dotnet build 生成项目。 每个命令定义其自己的选项和参数。 所有命令都支持选项, --help 用于打印有关如何使用命令的简要说明。
  • 它运行 .NET 应用程序。

你将使用 dotnet new 命令在 Linux 中创建第一个 ASP.NET Core 项目。 此命令获取项目类型作为参数。 本文档介绍了项目类型。 还可以通过在不使用 参数的情况下运行 dotnet new 来显示类型列表。 以下屏幕截图中以黄色突出显示了与 Web 相关的项目类型。

dotnet new 命令的屏幕截图。

使用 SDK 创建 .NET Core Web 应用程序

你将使用 .NET CLI 通过以下命令创建第一个 Web 应用程序:

dotnet new <template_type> -n <project_name> -o <output_directory>

使用这些 dotnet new规则时适用:

  • 命令在输出目录中创建项目文件。 如果省略段 -o <output_directory> ,则会在当前目录中创建项目。 始终可以使用 -o 开关。
  • 如果该文件夹不存在,则命令会创建它。
  • 如果省略段 -n <project_name> ,则项目名称将与目录名称相同。

欢迎查找目录和项目本身的创意名称。 但请记住,Linux 区分大小写。 对于本练习,请使用较保守 AspNetCoreDemo 的 作为项目名称,并在 目录中创建它 firstwebapp

若要创建项目,请运行以下命令:

dotnet new webapp -n AspNetCoreDemo -o firstwebapp 

检查输出以查看目录和项目名称。 以下屏幕截图还列出了输出目录的内容。 如果以前在 Windows 上创建了 ASP.NET Core Web 应用程序,则应熟悉目录结构。

第一个 web 应用的 dotnet new 命令的屏幕截图。

你已创建第一个应用程序。 下一个任务是运行它。 将目录更改为项目文件夹,然后运行 dotnet run

dotnet run 命令的屏幕截图。

注意

此屏幕截图中的以下项:

  • Web 应用程序在端口 5001 上侦听 HTTPS 请求,在端口 5000 上侦听 HTTP 请求。
  • 内容根目录位于主目录下。

建议不要让应用程序在主目录下运行。 稍后会将其发布到另一个目录,但应在发布之前对其进行测试。 可以按 Ctrl+C 停止应用程序。 但目前,请保持其运行状态,并使用首选方法打开新的终端会话,以连接到 Linux 虚拟机。 对于此示例,你将再次使用 PowerShell。

从另一个终端测试网站

在新终端会话中,验证应用程序是否正在侦听端口 5000 和 5001。 Linux 具有与 Windows 相同的 netstat 命令。 与开关一起-tlp运行netstat。 可以熟悉本文中的netstat开关,也可以通过运行 man netstatinfo netstat查看帮助文件。

下面是第二个终端会话中 netstat -tlp 命令的输出。 它显示 AspNetCoreDemo 进程正在使用 PID 781 运行,并且正在侦听 IPv4 和 IPv6 的端口 5000 和 5001。

info netstat 命令的屏幕截图。

可以使用 curlwget 来测试网站。 这两个命令都对目标端进行 HTTP 调用,但它们的行为方式不同:

  • Curl 只是命令行浏览器工具。 它向给定目标发出 HTTP 请求,并且仅显示 HTTP 响应的纯输出。 例如,它显示 Web 应用程序的 HTML 源标记。
  • Wget 是 HTTP 下载器。 它发出 HTTP 请求,并下载给定的资源。 例如,wget http://server/file.ziphttp://server 下载 file.zip 并将其保存到当前目录。

wget 命令还向我们展示了一些更多详细信息,例如重定向和你可能收到的任何错误消息。 因此,每当需要时,都可以将其用作 HTTP 跟踪工具的基元版本。

有关 和 wget之间的差异curl的详细信息,请转到 StackExchange 网页

在本培训系列中,你以前曾用于 wget 在安装 .NET Core 之前从 Microsoft 服务器下载 .deb 包管理器文件。

如果运行 curl http://localhost,则不会发生任何操作。 这很可能意味着没有 HTTP 响应。 然后,可以运行 wget http://localhost 检查尝试访问站点时是否显示更多信息。

curl localhost 命令的屏幕截图。

现在将发生以下情况:

  • 向 发出 HTTP 请求 http://localhost:5000,成功连接。 这意味着应用程序正在接受端口 5000 上的连接。
  • 你会收到来自应用程序的 HTTP 307 临时重定向响应,该响应指向安全 HTTPS 位置: https://locahost:5001
  • Wget 非常聪明,可以遵循此重定向,并向 发出新请求 https://localhost:5001
  • 再次成功连接。 但是, wget 不信任 SSL 证书。 因此,连接失败。

命令 wget 建议使用 --no-check-certificate 开关进行不安全连接来解决此问题。 但是,此方法涉及此培训 范围外 使用的 SSL 证书设置。 相反,可以配置 ASP.NET Core应用程序,使其不会将 HTTP 请求重定向到 HTTPS。 如果熟悉 ASP.NET Core应用程序开发 (或仅了解配置) ,则可能已经知道如何执行此操作:编辑Startup.cs文件以删除重定向配置。

使用 vi 编辑文件

可以使用适用于 Linux 发行版的 vi 文本编辑器来编辑所有类型的纯文本文件。 你将在本培训中使用它来重新配置应用程序。

必须先关闭应用程序,然后才能对其进行编辑。 首先关闭打开的终端会话。 然后按 Ctrl+C 关闭应用程序。

若要编辑 Startup.cs 文件,请运行以下命令:

vi ~/firstwebapp/Startup.cs

注意

此命令启动 vi 编辑器,然后加载文件。 ~ (平铺) 快捷方式是指创建项目的主目录。 也就是说,命令指向 /home/<YourName>/firstwebapp/Startup.cs

I (“插入) ”键以启用编辑模式。 现在,应在命令行底部看到 -- INSERT -- 。 使用箭头键在文件中导航。 app.UseHsTs()通过在行的开头添加//来注释 ; 和 app.UseHttpsRedirection()行,如以下屏幕截图中所示。

代码中注释的屏幕截图。

esc 退出编辑模式,输入 :wq!,然后按 Enter。 请注意,冒号字符 (:) 表示你正在输入命令, w 表示写入, q 表示退出,并 ! 强制写入。

代码中 wq 文本的屏幕截图。

按 Enter 后,应保存更改。 可以通过运行 cat ~/firstwebapp/Startup.cs来验证更改。 此命令显示 Startup.cs 文件的内容。

重新启动应用程序。 为此,请将当前目录更改为 目录 ~/firstwebapp ,然后再次运行 dotnet run。 然后,打开服务器的另一个终端会话,并再次运行命令 curl http://localhost:5000 。 这一次,命令应返回主页的 HTML 内容。

curl localhost at 5000 port 命令的屏幕截图。

现已在 Linux 上成功运行第一个 ASP.NET Core Web 应用。

将应用程序部署到 /var 目录

本练习的主要目标是将 Web 应用程序托管在反向代理后面,以便连接客户端可以通过仅使用主机名而不使用端口号从另一台计算机访问应用程序。 这是你预期在现实世界场景中发生的情况。 稍后你将使用 Nginx 来完成此任务。 但在执行此操作之前,请将应用程序发布到 /var 目录。 这是因为我们建议不要在用户的主目录中运行应用程序。

请记住, /var 目录用于存储各种应用程序(如 Apache 和 Nginx)的内容和日志文件。 你将按照此处的做法,将新创建的 Web 应用程序发布到 /var

更改为项目文件夹,然后运行 dotnet publish 以创建发布文件夹。 将该文件夹复制到 /var 目录。

dotnet publish 命令的屏幕截图。

屏幕截图显示命令 dotnet publish~/firstwebapp/bin/Debug/net5.0/publish/ 文件夹中创建了发布文件。 然后,使用以下命令将所有文件复制到 /var/firstwebapp/ 文件夹:

sudo cp -a ~/firstwebapp/bin/Debug/net5.0/publish/ /var/firstwebapp/

注意

请注意复制命令前的 sudo 用法。 之所以使用此方法,是因为标准用户对 /var 目录没有写入权限。 因此,必须以超级用户身份运行 命令。

若要从已发布的文件夹运行应用程序,请运行以下命令:

dotnet /var/firstwebapp/AspNetCoreDemo.dll

如果需要,可以使用相同的 curlwget 命令运行这些测试。 这是因为应用程序仍将侦听端口 5000 的 HTTP 请求。

过程的生存期和后续步骤

如果应用程序需要持续运行时间,则由于以下原因,在交互式用户会话中运行 .NET Core 应用程序不是一种很好的做法:

  • 如果用户终止其会话(例如,通过关闭 PuTTY 或 PowerShell SSH 客户端或退出会话),应用程序将关闭。
  • 例如,如果进程因某种原因而终止, (进程因) 未经处理的异常而崩溃,则进程不会自动启动,必须手动重启。
  • 如果重新启动服务器,应用程序不会自动启动。

后续步骤

第 2.2 部分 - 安装 Nginx 并将其配置为反向代理服务器

确保 Web 应用程序自动启动。 安装 Nginx 并将其配置为反向代理,以将向端口 80 发出的 HTTP 请求路由到 dotnet 应用程序,而不是 (以便客户端无需提供端口号) 即可进行连接。

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。