通过


你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:将 ASP.NET Core和Azure SQL 数据库应用部署到Azure 应用服务

本教程介绍如何部署数据驱动 ASP.NET Core应用以Azure 应用服务并连接到Azure SQL 数据库。 你还将部署一个Azure Cache for Redis,以便在应用程序中启用缓存代码。 Azure 应用服务是一种高度可缩放的自修补 Web 托管服务,可以轻松地在 Windows 或 Linux 上部署应用。 尽管本教程使用 ASP.NET Core 8.0 应用,但对于其他版本的 ASP.NET Core,此过程是相同的。

本教程介绍如何执行下列操作:

  • 创建默认安全的应用服务、SQL 数据库和 Redis 缓存体系结构。
  • 使用托管标识和密钥保管库引用保护连接机密。
  • 从GitHub存储库将示例 ASP.NET Core应用部署到应用服务。
  • 在应用程序代码中访问应用服务连接字符串和应用设置。
  • 进行更新并重新部署应用程序代码。
  • 通过上传迁移捆绑包生成数据库架构。
  • 从Azure流式传输诊断日志。
  • 在Azure门户中管理应用。
  • 使用Azure开发人员 CLI 预配相同的体系结构和部署。
  • 使用 GitHub Codespaces 和 GitHub Copilot 优化开发工作流。

先决条件

跳到末尾

如果只想在本教程中看到在 Azure 中运行的示例应用,只需在 Azure Cloud Shell 中运行以下命令,然后按照提示操作:

dotnet tool install --global dotnet-ef
mkdir msdocs-app-service-sqldb-dotnetcore
cd msdocs-app-service-sqldb-dotnetcore
azd init --template msdocs-app-service-sqldb-dotnetcore
azd up

1.运行示例

首先,将示例数据驱动的应用设置为起点。 为方便起见,sample 存储库包括dev 容器配置。 开发容器包含开发应用程序所需的所有内容,包括示例应用程序所需的数据库、缓存和所有环境变量。 开发容器可以在 GitHub codespace 中运行,这意味着可以使用 Web 浏览器在任何计算机上运行示例。

步骤 1:在新浏览器窗口中:

  1. 登录到GitHub帐户。
  2. 导航到 https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore/fork
  3. 取消选择“仅复制主分支”。 你需要所有分支。
  4. 选择“创建分支”。

步骤 2:在 GitHub 分支中:

  1. 选择“main”>“starter-no-infra”作为起始分支。 此分支仅包含示例项目,没有Azure相关文件或配置。
  2. 选择代码>Codespaces>在 starter-no-infra 上创建代码空间。 设置 codespace 需要几分钟时间。

A 屏幕截图显示如何在 GitHub.

步骤 3:在 codespace 终端中

  1. 使用 dotnet ef database update 运行数据库迁移。
  2. 使用 dotnet run 运行应用。
  3. 看到通知 Your application running on port 5093 is available. 时,选择“在浏览器中打开”。 应在新的浏览器选项卡中看到该示例应用程序。若要停止应用程序,请键入 Ctrl+C

提示

您可以询问 GitHub Copilot 有关此存储库的情况。 例如:

  • @workspace 这个项目有什么用?
  • @workspace .devcontainer 文件夹有什么用?

遇到问题? 检查故障排除部分

2.创建应用服务、数据库和缓存

在此步骤中,将创建Azure资源。 本教程中使用的步骤创建了一组默认安全的资源,其中包括应用服务、Azure SQL 数据库和 Azure 缓存。 此创建过程中,你将指定:

  • Web 应用的“名称”。 它用作应用的 DNS 名称的一部分。
  • “地区”,即应用在真实世界运行的地区。 它还用作应用的 DNS 名称的一部分。
  • 应用的运行时堆栈。 您可以在此选择应用程序所要使用的 .NET 版本。
  • 应用的托管计划。 它是一个包括应用功能集和扩展能力的价格层。
  • 资源组”,即应用的资源组。 资源组允许对应用程序所需的所有Azure资源进行分组(在逻辑容器中)。

登录到 Azure 门户并按照以下步骤创建Azure 应用服务资源。

步骤 1: 在Azure门户中:

  1. 在顶部搜索栏中,键入“应用服务”
  2. 在“服务”标题下选择标有“应用服务”的项
  3. 选择“创建”“Web 应用”>。 还可以直接导航到 创建向导

第 2 步:在“创建 Web 应用”页上,按如下所述填写表单。

  1. 名称msdocs-core-sql-XYZ。 将为你生成名为 msdocs-core-sql-XYZ_group 的资源组。
  2. Runtime stack.NET 8 (LTS)
  3. 作系统Linux
  4. 区域:首选区域。
  5. Linux 计划新建 并使用名称 msdocs-core-sql-XYZ
  6. 定价计划基本 B1。 准备就绪后,可以纵向扩展到不同的定价层。

步骤 3:

  1. 选择“ 数据库 ”选项卡。
  2. 选择“ 创建数据库”。
  3. “引擎”中,选择 “SQLAzure”。
  4. 选择 创建 Azure Cache for Redis
  5. “名称 ”(“缓存”下)中,输入缓存的名称。
  6. 在“SKU”中,选择“基本”。

步骤 4:

  1. 选择“ 部署 ”选项卡。
  2. 启用 持续部署
  3. Organization 中,选择GitHub别名。
  4. 在“存储库”中,选择“msdocs-app-service-sqldb-dotnetcore”。
  5. 在“分支”中,选择“starter-no-infra”。
  6. 确保禁用 基本身份验证
  7. 选择“查看 + 创建”
  8. 验证完成后,选择“创建”。

步骤 5: 部署需要几分钟才能完成。 部署完成后,选择“转到资源”按钮。 你会直接转到应用服务应用,但以下资源现已创建:

  • 资源组:所有已创建资源的容器。
  • 应用服务计划:为应用服务定义计算资源。 创建了一个属于Basic层的 Linux 计划。
  • 应用服务:表示应用并在应用服务计划中运行。
  • 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
  • 专用终结点:虚拟网络中的密钥保管库、数据库服务器和 Redis 缓存的访问终结点。
  • 网络接口:表示专用 IP 地址,每个专用终结点各一个。
  • Azure SQL 数据库服务器:只能通过其专用终结点访问。
  • Azure SQL 数据库:在服务器上创建数据库和用户。
  • Azure Cache for Redis:只能从其专用终结点后面访问。
  • 密钥保管库:只能通过其专用终结点访问。 用于管理应用服务应用的机密。
  • 专用 DNS区域:在虚拟网络中启用密钥保管库、数据库服务器和 Redis 缓存的 DNS 解析。

3.安全连接机密

创建向导已生成作为 .NET 连接字符串应用设置的连接变量。 但是,安全最佳做法是将机密完全排除在应用服务之外。 你将借助服务连接器将机密移动到密钥保管库,并将应用设置更改为密钥保管库引用

提示

若要使用无密码身份验证,请参阅如何更改 SQL 数据库连接以改用托管标识?

步骤 1:检索现有连接字符串

  1. 在应用服务页面的左侧菜单中,选择“设置”>“环境变量”>“连接字符串”。
  2. 选择“AZURE_SQL_CONNECTIONSTRING”。
  3. Add/Edit 连接字符串 中,在 Value 字段中,找到字符串末尾的 Password= 部分。
  4. 复制“Password=”后的密码字符串供以后使用。 通过此连接字符串,可以连接到受专用终结点保护的 SQL 数据库。 但是,机密直接保存在应用服务应用中,这不是最好的做法。 同样,App 设置选项卡中的 Redis 缓存连接字符串包含机密。 你将对此进行更改。

步骤 2:创建密钥保管库以安全管理机密

  1. 在顶部搜索栏中,键入“key vault”,然后选择Marketplace>密钥保管库
  2. 资源组中,选择 msdocs-core-sql-XYZ_group
  3. 在“密钥保管库名称”中,键入仅包含字母和数字的名称。
  4. 在“区域”中,将其设置为资源组所在的同一位置。

步骤 3:使用专用终结点保护密钥保管库

  1. 选择“网络”选项卡。
  2. 取消选择“启用公共访问”
  3. 选择“创建专用终结点”。
  4. 资源组中,选择 msdocs-core-sql-XYZ_group
  5. 在对话框中,在“位置”中,选择与应用服务应用相同的位置。
  6. 名称中,键入msdocs-core-sql-XYZVvaultEndpoint
  7. 虚拟网络中,选择 msdocs-core-sql-XYZ_group 组中的虚拟网络。
  8. “子网”中,选择可用的兼容子网。 为了方便起见,Web 应用向导创建了它。
  9. 选择“确定”
  10. 依次选择“查看 + 创建”和“创建”。 等待密钥保管库部署完成。 应会看到“部署已完成”。

步骤 4:

  1. 在顶部搜索栏中,键入“msdocs-core-sql”,然后键入名为“msdocs-core-sql-XYZ”的应用服务资源。
  2. 在应用服务页面的左侧菜单中,选择“设置”>“服务连接器”。 已经有两个连接器,这是应用创建向导为你创建的。
  3. 选中 SQL 数据库连接器旁边的复选框,然后选择“编辑”
  4. 选择“身份验证”选项卡。
  5. 在“密码”中,粘贴你之前复制的密码。
  6. 选择在 密钥保管库 中存储机密
  7. ‘密钥保管库’ 连接下,选择“新建”。 在编辑对话框顶部打开“创建连接”对话框。

步骤 5:建立密钥保管库连接

  1. Create connection 对话框中,为密钥保管库连接,在 密钥保管库 中选择您之前创建的密钥保管库。
  2. 选择“查看 + 创建” 。
  3. 验证完成后,选择“创建”。

步骤 6:完成 SQL 数据库连接器设置

  1. 你现在回到编辑对话框defaultConnector中。 在“身份验证”选项卡中,等待创建密钥保管库连接器。 完成后,“密钥保管库连接”下拉列表会自动选择所创建内容。
  2. 选择“下一页:网络”。
  3. 选择“配置防火墙规则以启用对目标服务的访问权限”。 应用创建向导已使用专用终结点保护 SQL 数据库。
  4. 选择“保存”。 等待“更新成功”通知出现

步骤 7:将 Redis 连接器配置为使用密钥保管库机密

  1. 在“服务连接器”页中,选中 Redis 缓存连接器旁边的复选框,然后选择“ 编辑”。
  2. 选择“身份验证”选项卡。
  3. 选择在 密钥保管库 中存储机密
  4. 密钥保管库 连接下,选择您创建的密钥保管库。
  5. 选择“下一页:网络”。
  6. 选择“配置防火墙规则以启用对目标服务的访问权限”。
  7. 选择“保存”。 等待“更新成功”通知出现

Step 8:验证密钥保管库集成

  1. 在左侧菜单中,再次选择“设置”>“环境变量”>“连接字符串”
  2. 在“AZURE_SQL_CONNECTIONSTRING”旁边,选择“显示值”。 该值应为@Microsoft.KeyVault(...),这意味着它是一个密钥保管库引用,因为机密现在由密钥保管库管理。
  3. 若要验证 Redis 连接字符串,请选择 App 设置选项卡。在 AZURE_REDIS_CONNECTIONSTRING 旁边,选择 Show 值。 该值也应为@Microsoft.KeyVault(...)

总之,保护连接机密的过程包括:

  • 从应用服务应用的环境变量中检索连接机密。
  • 创建密钥保管库。
  • 使用系统分配的托管标识创建密钥保管库连接。
  • 更新服务连接器以将机密存储在密钥保管库中。

4.部署示例代码

在此步骤中,将使用GitHub Actions配置GitHub部署。 这只是部署到应用服务的许多方法之一,也是一种在部署过程中持续集成的好方法。 默认情况下,GitHub存储库的每个git push都会启动生成和部署操作。

步骤 1:返回示例分支的 GitHub 代码空间,运行 git pull origin starter-no-infra。 这会将新提交的工作流文件拉取到 codespace。

步骤 2 (选项 1: with GitHub Copilot):

  1. 选择“聊天”视图,然后选择 +,即可开始新的聊天会话。
  2. 问:“@workspace应用如何连接到数据库和缓存?”Copilot可能会提供有关 MyDatabaseContext 类以及如何在 Program.cs 中配置的说明。
  3. 问:“在生产模式下,我希望应用程序对数据库使用名为 AZURE_SQL_CONNECTIONSTRING 的连接字符串,并使用名为 AZURE_REDIS_CONNECTIONSTRING 的应用设置。”Copilot可能会给你提供类似于接下来 Option 2: 不使用 GitHub Copilot 的步骤 中的代码建议,甚至会告诉你在 Program.cs 文件中进行更改。
  4. 在资源管理器中打开 Program.cs 并添加代码建议。 GitHub Copilot不会每次都提供相同的响应,而且并不总是正确的。 可能需要提出更多问题来微调其响应。 有关提示,请参阅 如何在代码空间中使用GitHub Copilot?

步骤 2 (选项 2:无GitHub Copilot):

  1. 在资源管理器中打开 Program.cs
  2. 找到注释的代码(第 12-21 行),并取消注释。 此代码通过使用 AZURE_SQL_CONNECTIONSTRING 连接到数据库,并使用应用设置 AZURE_REDIS_CONNECTIONSTRING 连接到 Redis 缓存。

步骤 3 (选项 1: with GitHub Copilot):

  1. 在资源管理器中打开 .github/workflows/starter-no-infra_msdocs-core-sql-XYZ。 应用服务创建向导创建了此文件。
  2. 突出显示 dotnet publish 步骤并选择
  3. 询问 Copilot:“请安装 dotnet ef,然后在相同的输出文件夹中创建迁移捆绑包。
  4. 如果建议是可接受的,请选择“接受”。 GitHub Copilot不会每次都提供相同的响应,而且并不总是正确的。 可能需要提出更多问题来微调其响应。 有关提示,请参阅 如何在代码空间中使用GitHub Copilot?

步骤 3 (选项 2:无GitHub Copilot):

  1. 在资源管理器中打开 .github/workflows/starter-no-infra_msdocs-core-sql-XYZ。 应用服务创建向导创建了此文件
  2. dotnet publish 步骤下,添加一个步骤以使用命令 安装 dotnet tool install -g dotnet-ef --version 8.*
  3. 在新步骤下,添加另一个步骤以在部署包中生成数据库迁移捆绑包dotnet ef migrations bundle --runtime linux-x64 -o ${{env.DOTNET_ROOT}}/myapp/migrationsbundle。 迁移捆绑包是可在生产环境中运行的自包含可执行文件,无需.NET SDK。 应用服务 linux 容器仅具有.NET运行时,而没有.NET SDK。

步骤 4:

  1. 选择“源代码管理”扩展。
  2. 在文本框中,键入提交消息,如 Configure Azure database and cache connections。 或者,选择 ,让GitHub Copilot为你生成提交消息。
  3. 选择“提交”,然后使用“是”进行确认
  4. 选择“同步更改 1”,然后使用“确定”进行确认。

步骤 5:返回 Azure 门户中的部署中心页:

  1. 选择“日志”选项卡,然后选择“刷新”以查看新的部署运行。
  2. 在部署运行的日志项中,选择具有最新时间戳的“生成/部署日志”条目。

Step 6: 你已访问GitHub存储库,并看到GitHub操作正在运行。 工作流文件定义两个单独的阶段,即生成和部署阶段。 等待GitHub运行显示成功的状态。 此过程大约需要 5 分钟。

遇到问题? 检查故障排除部分

5.生成数据库架构

在 SQL 数据库受虚拟网络保护的情况下,运行 dotnet 数据库迁移的最简单方法是使用应用服务中的 Linux 容器在 SSH 会话中运行。

步骤 1:返回“应用服务”页,在左侧菜单中,

  1. 选择“开发工具”“SSH”。>
  2. 选择“转到”。 (启动需要几分钟时间。

步骤 2:在 SSH 会话中:

  1. 运行 cd /home/site/wwwroot。 下面是所有已部署的文件。
  2. 使用命令./migrationsbundle -- --environment Production运行GitHub工作流生成的迁移捆绑包。 如果该命令成功,则应用服务会成功连接到 SQL 数据库。 请记住,--environment Production 对应于你在 Program.cs 中所做的代码更改。

在 SSH 会话中,只有在 /home 中对文件进行的更改才能在应用重启后保持。 不会保留 /home 外部的更改。

遇到问题? 检查故障排除部分

6.导航到应用程序

步骤 1:在“应用服务”页中:

  1. 从左侧菜单中选择“概述”。
  2. 选择应用的 URL。

步骤 2:将一些任务添加到列表。 恭喜,你正在Azure 应用服务中运行 Web 应用,并安全连接到Azure SQL 数据库。

提示

示例应用程序实现缓存端模式。 第二次访问数据视图或在数据更改后重新加载同一页时,网页中的 处理时间 显示更快的时间,因为它从缓存而不是数据库加载数据。

7.流式传输诊断日志

Azure 应用服务捕获所有控制台日志,以帮助诊断应用程序的问题。 该示例应用在其每个终结点中包含日志记录代码,以演示此功能。

步骤 1:在“应用服务”页中:

  1. 在左侧菜单中,选择“监视”>“应用服务日志”。
  2. 在“应用程序日志记录”下,选择“文件系统”。
  3. 在顶部菜单中,选择“保存”。

步骤 2:在左侧菜单中,选择“日志流”。 将显示应用的日志,包括平台日志和容器内部的日志。

8.清理资源

完成后,可以通过删除资源组,从Azure订阅中删除所有资源。

步骤 1: Azure 门户顶部的搜索栏中:

  1. 输入资源组名称。
  2. 选择前面创建的资源组。

步骤 2:在资源组页上,选择“删除资源组”。

步骤 3:

  1. 输入资源组名称以确认删除。
  2. 选择“删除”。

2.创建Azure资源并部署示例应用

在此步骤中,将创建Azure资源,并将示例应用部署到Linux 上的应用服务。 本教程中使用的步骤创建了一组默认安全的资源,其中包括应用服务、Azure SQL 数据库和 Azure Redis 缓存。

开发容器已具有 Azure Developer CLI (AZD)。

  1. 从存储库根路径,运行 azd init

    azd init --template dotnet-app-service-sqldb-infra
    
  2. 出现提示时,请提供以下答案:

    问题 回答
    当前的目录不为空。 是否要在此处初始化“<your-directory>”中的项目? Y
    你希望对这些文件执行哪些操作? 使现有文件保持不变
    输入新环境名称 键入唯一名称。 AZD 模板将此名称用作 Azure(<app-name>-<hash>.azurewebsites.net)中 Web 应用的 DNS 名称的一部分。 允许使用字母数字字符和下划线。
  3. 通过运行 azd auth login 命令并按照提示登录Azure:

    azd auth login
    
  4. 使用 azd up 命令创建必要的Azure资源并部署应用代码。 按照提示为Azure资源选择所需的订阅和位置。

    azd up
    

    azd up 命令需要大约 15 分钟来完成(Redis 缓存需要的时间最长)。 它还会编译和部署应用程序代码,但你稍后将修改代码以使用应用服务。 在运行时,该命令提供有关预配和部署过程的消息,包括指向Azure中的部署的链接。 完成后,命令还会显示指向部署应用程序的链接。

    此 AZD 模板包含文件(azure.yamlinfra 目录),这些文件默认使用以下Azure资源生成安全体系结构:

    • 资源组:所有已创建资源的容器。
    • 应用服务计划:为应用服务定义计算资源。 创建了一个属于Basic层的 Linux 计划。
    • 应用服务:表示应用并在应用服务计划中运行。
    • 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
    • 专用终结点:虚拟网络中的密钥保管库、数据库服务器和 Redis 缓存的访问终结点。
    • 网络接口:表示专用 IP 地址,每个专用终结点各一个。
    • Azure SQL 数据库服务器:只能通过其专用终结点访问。
    • Azure SQL 数据库:在服务器上创建数据库和用户。
    • Azure Cache for Redis:只能从其专用终结点后面访问。
    • 密钥保管库:只能通过其专用终结点访问。 用于管理应用服务应用的机密。
    • 专用 DNS区域:在虚拟网络中启用密钥保管库、数据库服务器和 Redis 缓存的 DNS 解析。

    命令第一次完成创建资源和部署应用程序代码后,部署的示例应用尚不起作用,因为必须进行少量更改,使其连接到Azure中的数据库。

遇到问题? 检查故障排除部分

3.验证连接字符串

提示

默认 SQL 数据库连接字符串使用 SQL 身份验证。 有关更安全的无密码身份验证,请参阅如何更改 SQL 数据库连接以改用托管标识?

你使用的 AZD 模板已为你生成了连接变量作为应用设置,并将它们输出到终端,以方便你使用。 使用应用设置可以将连接机密保留在代码存储库之外。

  1. 在 AZD 输出中,找到设置 AZURE_SQL_CONNECTIONSTRINGAZURE_REDIS_CONNECTIONSTRING。 仅显示设置名称。 如 AZD 输出中所示:

     App Service app has the following connection strings:
         - AZURE_SQL_CONNECTIONSTRING
         - AZURE_REDIS_CONNECTIONSTRING
         - AZURE_KEYVAULT_RESOURCEENDPOINT
         - AZURE_KEYVAULT_SCOPE
     

    AZURE_SQL_CONNECTIONSTRING 包含 Azure SQL 数据库的连接字符串,AZURE_REDIS_CONNECTIONSTRING 包含 Azure Redis 缓存的连接字符串。 稍后需要在代码中使用它们。

  2. 为方便起见,AZD 模板会显示应用的应用设置页的直接链接。 找到该链接并在新的浏览器选项卡中打开它。

遇到问题? 检查故障排除部分

4.修改示例代码并重新部署

  1. 在 GitHub codespace 中,选择 Chat 视图,然后选择 +来启动新的聊天会话。

  2. 问:“@workspace应用如何连接到数据库和缓存?”Copilot可能会提供有关 MyDatabaseContext 类以及如何在 Program.cs 中配置的说明。

  3. 问:“在生产模式下,我希望应用对数据库使用名为AZURE_SQL_CONNECTIONSTRING的连接字符串和名为”AZURE_REDIS_CONNECTIONSTRING*“的应用设置。”Copilot可能会为你提供类似于 Option 2 中的代码建议:没有GitHub Copilot后续步骤,甚至指示你在 Program.cs 文件中进行更改。

  4. 在资源管理器中打开 Program.cs 并添加代码建议。

    GitHub Copilot不会每次都提供相同的响应,而且并不总是正确的。 可能需要提出更多问题来微调其响应。 有关提示,请参阅 如何在代码空间中使用GitHub Copilot?

在部署这些更改之前,仍需要生成迁移捆绑包。

遇到问题? 检查故障排除部分

5.生成数据库架构

在 SQL 数据库受虚拟网络保护的情况下,运行数据库迁移的最简单方法是使用应用服务容器在 SSH 会话中运行。 但是,应用服务 Linux 容器没有.NET SDK,因此运行数据库迁移的最简单方法是上传自包含迁移捆绑包。

  1. 使用以下命令为项目生成迁移捆绑包:

    dotnet ef migrations bundle --runtime linux-x64 -o migrationsbundle
    

    提示

    示例应用程序(请参阅 DotNetCoreSqlDb.csproj) 配置为包含此 migrationsbundle 文件。 在 azd package 阶段,migrationsbundle 将添加到部署包。

  2. 使用 azd up 部署所有更改。

    azd up
    
  3. 在 AZD 输出中,找到 SSH 会话的 URL,并在浏览器中导航到该 URL。 它在输出中如下所示:

     Open SSH session to App Service container at: <URL>
     
  4. 在 SSH 会话中运行以下命令:

    cd /home/site/wwwroot
    ./migrationsbundle -- --environment Production
    

    如果该命令成功,则应用服务会成功连接到数据库。 请记住,--environment Production 对应于你在 Program.cs 中所做的代码更改。

    注意

    只有对 /home 中文件的更改才能在应用重启之后持久保存。 不会保留 /home 外部的更改。

遇到问题? 检查故障排除部分

6.导航到应用程序

  1. 在 AZD 输出中,找到应用的 URL 并在浏览器中导航到该 URL。 该 URL 在 AZD 输出中如下所示:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <URL>
     
  2. 将一些任务添加到列表。

    ASP.NET Core Web 应用程序在 Azure 中运行的 SQL 数据库的屏幕截图,显示了任务。

    恭喜,你正在Azure 应用服务中运行 Web 应用,并安全连接到Azure SQL 数据库。

遇到问题? 检查故障排除部分

7.流式传输诊断日志

Azure 应用服务可以捕获控制台日志,以帮助诊断应用程序的问题。 为方便起见,AZD 模板已启用对本地文件系统的日志记录,并会将日志传送到 Log Analytics 工作区

示例应用程序包括标准日志记录语句,用于演示此功能,如以下代码片段所示:

public async Task<IActionResult> Index()
{
    var todoItems = await _cache.GetAsync(_TodoItemsCacheKey);
    if (todoItems != null)
    {
        _logger.LogInformation("Data from cache.");
        var todoList = JsonConvert.DeserializeObject<List<Todo>>(Encoding.UTF8.GetString(todoItems));
        return View(todoList);
    }
    else
    {
        _logger.LogInformation("Data from database.");
        var todoList = await _context.Todo.ToListAsync();
        var serializedTodoList = JsonConvert.SerializeObject(todoList);
        await _cache.SetAsync(_TodoItemsCacheKey, Encoding.UTF8.GetBytes(serializedTodoList));
        return View(todoList);
    }
}

在 AZD 输出中,找到流式传输应用服务日志的链接,并在浏览器中导航到该链接。 该链接在 AZD 输出中如下所示:

Stream App Service logs at: <URL>

了解有关在.NET应用中进行日志记录的详细信息,请参阅系列文章《为.NET、Node.js、Python 和 Java 应用程序启用 Azure Monitor OpenTelemetry》

遇到问题? 检查故障排除部分

8.清理资源

若要删除当前部署环境中的所有Azure资源,请运行 azd down并按照提示进行操作。

azd down

故障排除

Azure SQL 数据库的门户部署视图显示冲突状态

根据订阅和所选区域,你可能会看到Azure SQL 数据库Conflict的部署状态,操作详细信息中显示以下消息:

Location '<region>' is not accepting creation of new Windows Azure SQL Database servers at this time.

此错误很可能是由所选区域的订阅限制引起的。 请尝试为部署选择其他区域。

在 Azure 门户中,Web 应用的日志流界面显示网络错误。

你可能会看到以下错误:

Unable to open a connection to your app. This may be due to any network security groups or IP restriction rules that you have placed on your app. To use log streaming, please make sure you are able to access your app directly from your current network.

首次启动应用时,这通常是暂时性错误。 请等候几分钟,然后再次查看。

浏览器中的 SSH 会话显示 SSH CONN CLOSED

启动 Linux 容器需要花费几分钟时间。 请等候几分钟,然后再次查看。

门户日志流页显示 Connected!,但没有日志

配置诊断日志后,该应用将重启。 可能需要刷新页面,以便更改在浏览器中生效。

常见问题解答

这个配置多少钱?

所创建资源的定价如下所示:

  • 应用服务计划在基本层中创建,可以进行纵向扩展或缩减。 请参阅应用服务定价
  • Azure SQL 数据库是在标准系列硬件上使用最低核心的常规用途无服务器层创建的。 成本很小,可以分发到其他区域。 可以通过减小其最大大小来进一步降低成本,也可以通过调整服务层、计算层、硬件配置、核心数、数据库大小和区域冗余来纵向扩展成本。 请参阅 Azure SQL 数据库 定价
  • Azure Cache for Redis是在具有最小缓存大小的 Basic 层中创建的。 此层级的相关成本很低。 你可将其纵向扩展到更高的性能层,以实现更高的可用性、聚类分析和其他功能。 请参阅 Azure Cache for Redis 定价
  • 除非配置额外的功能(例如对等互连),否则虚拟网络不会收取费用。 请参阅 Azure 虚拟网络 定价
  • 专用 DNS 区域会产生少量费用。 请参阅 Azure DNS 定价

如何使用其他工具连接到在虚拟网络后面保护的Azure SQL 数据库服务器?

  • 要从命令行工具进行基本访问,可以从应用的 SSH 终端运行 sqlcmd。 应用的容器不附带 sqlcmd,因此必须手动安装它。 请记住,已安装的客户端不会在应用重启时持久保存。
  • 若要从SQL Server Management Studio客户端或Visual Studio进行连接,计算机必须位于虚拟网络中。 例如,它可以是连接到其中一个子网的 Azure VM,也可以是与 Azure 虚拟网络建立了站点到站点 VPN 连接的本地网络中的计算机。

本地应用开发如何与GitHub Actions配合使用?

以应用服务自动生成的工作流文件为例,每个 git push 文件都会启动新的生成和部署运行。 从GitHub存储库的本地克隆中,将所需的更新推送到GitHub。 例如:

git add .
git commit -m "<some-message>"
git push origin main

如何调试在 GitHub Actions 部署期间出现的错误?

如果自动生成GitHub工作流文件中的步骤失败,请尝试修改失败的命令以生成更详细的输出。 例如,可通过添加 dotnet 选项从任何 -v 命令中获取更多输出。 请提交并推送更改,以触发另一次应用服务部署流程。

我无权创建用户分配的标识

请参阅从部署中心设置 GitHub Actions 部署

如何更改 SQL 数据库连接以改用托管标识?

服务连接器使用名称 defaultConnector 管理 SQL 数据库的默认连接字符串,并使用 SQL 身份验证。 若要将其替换为使用托管标识的连接,请在替换占位符后在 cloud shell 中运行以下命令:

az extension add --name serviceconnector-passwordless --upgrade
az sql server update --enable-public-network true
az webapp connection delete sql --connection defaultConnector --resource-group <group-name> --name <app-name>
az webapp connection create sql --connection defaultConnector --resource-group <group-name> --name <app-name> --target-resource-group <group-name> --server <database-server-name> --database <database-name> --client-type dotnet --system-identity --config-connstr true
az sql server update --enable-public-network false

默认情况下,命令 az webapp connection create sql --client-type dotnet --system-identity --config-connstr 执行以下操作:

  • 将用户设置为 Microsoft Entra ID SQL 数据库服务器的管理员。
  • 创建系统分配的托管标识,并向其授予对数据库的访问权限。
  • 生成一个名为 AZURE_SQL_CONNECTIONGSTRING 的无密码连接字符串,您的应用程序已在本教程结束时使用。

你的应用现在应已连接到 SQL 数据库。 有关详细信息,请参阅 教程:使用托管标识在不使用机密的情况下从应用服务连接到 Azure 数据库

提示

不想启用公用网络连接? 如果订阅上具有az sql server update --enable-public-network true角色分配,则可以从与虚拟网络集成的 Azure Cloud Shell 中运行命令来跳过

az webapp connection create sql 需要使用 Entra ID 身份验证与数据库服务器直连,才能授予该身份对由虚拟网络保护的数据库所需的访问权限。 默认情况下,Azure cloud shell 无权访问受网络保护的数据库。

如何在代码空间中使用GitHub Copilot?

你可能已经注意到,当你创建代码空间时,GitHub Copilot 的聊天视图就已为你准备好了。 为方便起见,我们在容器定义中包含GitHub Copilot聊天扩展(请参阅 .devcontainer/devcontainer.json)。 但是,你需要一个GitHub Copilot帐户(30 天免费试用)。

在与GitHub Copilot交谈时,一些提示给你:

  • 在单次聊天会话中,问题和答案相互关联,你可以调整问题来微调所获得的答案。
  • 默认情况下,GitHub Copilot无权访问存储库中的任何文件。 若要询问有关文件的问题,请首先在编辑器中打开该文件。
  • 若要让GitHub Copilot在准备答案时访问存储库中的所有文件,请使用 @workspace 开始你的问题。 有关详细信息,请参阅 Use the @workspace agent
  • 在聊天会话中,GitHub Copilot可以建议哪些地方需要修改(使用 @workspace),但不能替您进行更改。 你可以自行添加建议的更改并对其进行测试。

你还可以说下面的一些话来微调得到的答案:

  • 我希望此代码仅在生产模式下运行。
  • 我希望此代码仅在Azure 应用服务中运行,而不是在本地运行。
  • --output-path 参数似乎不受支持。

请继续学习下一教程,了解如何使用自定义域和证书保护应用。

或者,查看其他资源: