您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

教程:在 Azure 应用服务中生成 ASP.NET Core 和 SQL 数据库应用Tutorial: Build an ASP.NET Core and SQL Database app in Azure App Service

本文内容

备注

本文将应用部署到 Windows 上的应用服务。若要部署到 Linux 上的应用服务,请参阅在 Linux 上的 Azure 应用服务中生成 .NET Core 和 SQL 数据库应用

应用服务在 Azure 中提供高度可缩放、自修补的 Web 托管服务。本教程演示如何创建 .NET Core 应用,并将其连接至 SQL 数据库。完成操作后,将拥有一个在应用服务中运行的 .NET Core MVC 应用。

在应用服务中运行的应用

你将学习如何:

  • 在 Azure 中创建 SQL 数据库。
  • 将 .NET Core 应用连接到 SQL 数据库
  • 将应用部署到 Azure
  • 更新数据模型并重新部署应用
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

如果还没有 Azure 订阅,可以在开始前创建一个免费帐户

先决条件Prerequisites

为完成此教程:

创建本地 .NET Core 应用Create local .NET Core app

在此步骤中,你将设置本地 .NET Core 项目。

克隆示例应用程序Clone the sample application

在终端窗口中,通过 cd 转到工作目录。

运行以下命令来克隆示例存储库,并转到其根目录。

  1. git clone https://github.com/azure-samples/dotnetcore-sqldb-tutorial
  2. cd dotnetcore-sqldb-tutorial

此示例项目包含使用 Entity Framework Core 的基本 CRUD(创建-读取-更新-删除)应用。

运行应用程序Run the application

运行以下命令,安装所需的包,运行数据库迁移并启动应用程序。

  1. dotnet restore
  2. dotnet ef database update
  3. dotnet run

在浏览器中导航至 http://localhost:5000选择“新建” 链接,创建几个待办事项 。

已成功连接到 SQL 数据库

在终端按 Ctrl+C,随时停止 .NET Core。

使用 Azure Cloud ShellUse Azure Cloud Shell

Azure 托管 Azure Cloud Shell(一个可通过浏览器使用的交互式 shell 环境)。可以将 Bash 或 PowerShell 与 Cloud Shell 配合使用来使用 Azure 服务。可以使用 Azure Cloud Shell 预安装的命令来运行本文中的代码,而不必在本地环境中安装任何内容。

若要启动 Azure Cloud Shell,请执行以下操作:

选项示例/链接
选择代码块右上角的“试用”。 选择“试用” 不会自动将代码复制到 Cloud Shell。Azure Cloud Shell 的“试用”示例
转到 https://shell.azure.com 或选择“启动 Cloud Shell” 按钮可在浏览器中打开 Cloud Shell。在新窗口中启动 Cloud Shell
选择 Azure 门户右上角菜单栏上的 Cloud Shell 按钮。Azure 门户中的“Cloud Shell”按钮

若要在 Azure Cloud Shell 中运行本文中的代码,请执行以下操作:

  • 启动 Cloud Shell。

  • 选择代码块上的“复制”按钮 以复制代码。

  • 在 Windows 和 Linux 上选择 Ctrl+Shift+V 将代码粘贴到 Cloud Shell 会话中,或在 macOS 上选择 Cmd+Shift+V 将代码粘贴到 Cloud Shell 会话中。

  • 选择 Enter 运行此代码。

创建生产环境 SQL 数据库Create production SQL Database

此步骤在 Azure 中创建一个 SQL 数据库。应用部署到 Azure 后,它将使用该云数据库。

对于 SQL 数据库,本教程使用 Azure SQL 数据库

创建资源组Create a resource group

资源组是在其中部署和管理 Azure 资源(如 Web 应用、数据库和存储帐户)的逻辑容器。例如,可以选择在使用完之后通过一个简单的步骤删除整个资源组。

在 Cloud Shell 中,使用 az group create 命令创建资源组。以下示例在“西欧” 位置创建名为“myResourceGroup” 的资源组。要查看“免费”层中应用服务支持的所有位置,请运行 命令。az appservice list-locations —sku FREE

  1. az group create --name myResourceGroup --location "West Europe"

通常在附近的区域中创建资源组和资源。

此命令完成后,JSON 输出会显示资源组属性。

创建 SQL 数据库逻辑服务器Create a SQL Database logical server

在 Cloud Shell 中,使用 az sql server create 命令创建 SQL 数据库逻辑服务器。

将 <server_name> 占位符替换为唯一的 SQL 数据库名称 。此名称用作 SQL 数据库终结点 <server_name>.database.windows.net 的一部分,因此必须在 Azure 的所有逻辑服务器中具有唯一性。它只能包含小写字母、数字及连字符(-),长度必须为 3 到 50 个字符。此外,将 <db_username> 和 <db_password> 分别替换为所选用户名和密码 。

  1. az sql server create --name <server_name> --resource-group myResourceGroup --location "West Europe" --admin-user <db_username> --admin-password <db_password>

创建 SQL 数据库逻辑服务器后,Azure CLI 会显示类似于以下示例的信息:

  1. {
  2. "administratorLogin": "sqladmin",
  3. "administratorLoginPassword": null,
  4. "fullyQualifiedDomainName": "<server_name>.database.windows.net",
  5. "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Sql/servers/<server_name>",
  6. "identity": null,
  7. "kind": "v12.0",
  8. "location": "westeurope",
  9. "name": "<server_name>",
  10. "resourceGroup": "myResourceGroup",
  11. "state": "Ready",
  12. "tags": null,
  13. "type": "Microsoft.Sql/servers",
  14. "version": "12.0"
  15. }

配置服务器防火墙规则Configure a server firewall rule

使用 az sql server firewall create 命令创建 Azure SQL 数据库服务器级防火墙规则若同时将起始 IP 和结束 IP 设置为 0.0.0.0,防火墙将仅对其他 Azure 资源开启。

  1. az sql server firewall-rule create --resource-group myResourceGroup --server <server_name> --name AllowAllIps --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

提示

你甚至可以让防火墙规则更严格,即只使用应用所使用的出站 IP 地址

创建数据库Create a database

使用 az sql db create 命令在服务器中创建 S0 性能级别的数据库。

  1. az sql db create --resource-group myResourceGroup --server <server_name> --name coreDB --service-objective S0

创建连接字符串Create connection string

将下列字符串替换为先前所使用的 <server_name>、<db_username> 和 <db_password> 。

  1. Server=tcp:<server_name>.database.windows.net,1433;Database=coreDB;User ID=<db_username>;Password=<db_password>;Encrypt=true;Connection Timeout=30;

这是 .NET Core 应用的连接字符串。将其进行复制,留待稍后使用。

将应用部署到 AzureDeploy app to Azure

在此步骤中,将已连接 SQL 数据库的 .NET Core 应用程序部署到应用服务。

配置本地 Git 部署Configure local git deployment

可以使用“deployment user” 将 FTP 和本地 Git 部署到 Azure Web 应用。配置部署用户之后,可对所有 Azure 部署使用此用户。帐户级部署用户名和密码不同于 Azure 订阅凭据。

若要配置部署用户,请在 Azure Cloud Shell 中运行 az webapp deployment user set 命令。将 <username> 和 <password> 替换为部署用户名和密码。

  • 用户名在 Azure 中必须唯一,并且为了本地Git推送,不能包含“@”符号。
  • 密码必须至少为 8 个字符,且具有字母、数字和符号这三种元素中的两种。
  1. az webapp deployment user set --user-name <username> --password <password>

JSON 输出会将该密码显示为 null如果收到 'Conflict'. Details: 409 错误,请更改用户名。如果收到 'Bad Request'. Details: 400 错误,请使用更强的密码。

请记录你要用于部署 Web 应用的用户名和密码。

创建应用服务计划Create an App Service plan

在 Cloud Shell 中,使用 az appservice plan create 命令创建一个应用服务计划。

以下示例在免费定价层中创建名为 myAppServicePlan 的应用服务计划:

  1. az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

创建应用服务计划后,Azure CLI 会显示类似于以下示例的信息:

  1. {
  2. "adminSiteName": null,
  3. "appServicePlanName": "myAppServicePlan",
  4. "geoRegion": "West Europe",
  5. "hostingEnvironmentProfile": null,
  6. "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  7. "kind": "app",
  8. "location": "West Europe",
  9. "maximumNumberOfWorkers": 1,
  10. "name": "myAppServicePlan",
  11. < JSON data removed for brevity. >
  12. "targetWorkerSizeId": 0,
  13. "type": "Microsoft.Web/serverfarms",
  14. "workerTierName": null
  15. }

创建 Web 应用Create a web app

应用服务计划中创建一个 Web 应用myAppServicePlan

在 Cloud Shell 中可以使用 az webapp create 命令。在以下示例中,将 <app-name> 替换为全局唯一的应用名称(有效字符是 a-z0-9-)。

  1. az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --deployment-local-git

创建 Web 应用后,Azure CLI 会显示类似于以下示例的输出:

  1. Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
  2. {
  3. "availabilityState": "Normal",
  4. "clientAffinityEnabled": true,
  5. "clientCertEnabled": false,
  6. "clientCertExclusionPaths": null,
  7. "cloningInfo": null,
  8. "containerSize": 0,
  9. "dailyMemoryTimeQuota": 0,
  10. "defaultHostName": "<app-name>.azurewebsites.net",
  11. "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  12. "enabled": true,
  13. < JSON data removed for brevity. >
  14. }

备注

Git 远程的 URL 将显示在 deploymentLocalGitUrl 属性中,其格式为 https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git保存此 URL,后续将会用到。

配置连接字符串Configure connection string

若要为 Azure 应用设置连接字符串,请使用 Cloud Shell 中的 az webapp config appsettings set 命令。在下列命令中,将 <app name> 和 <connection_string> 参数替换为先前创建的连接字符串 。

  1. az webapp config connection-string set --resource-group myResourceGroup --name <app name> --settings MyDbConnection="<connection_string>" --connection-string-type SQLServer

在 ASP.NET Core 中,可以通过标准模式使用此命名连接字符串 (MyDbConnection),就像在 appsettings.json 中指定的任何连接字符串一样。在本例中,MyDbConnection 也在 appsettings.json 中定义。在应用服务中运行时,应用服务中定义的连接字符串优先于 appsettings.json 中定义的连接字符串。此代码在本地开发过程中使用 appsettings.json 值,相同的代码在部署时使用应用服务值。

若要了解如何在代码中引用连接字符串,请参阅在生产环境中连接到 SQL 数据库

配置环境变量Configure environment variable

接下来,将 ASPNETCORE_ENVIRONMENT 应用设置设置为“Production”。由于对本地开发环境使用 SQLite,并对 Azure 环境使用 SQL 数据库,因此通过此设置,你可以了解应用是否正在 Azure 中运行。

以下示例在 Azure 应用中配置 ASPNETCORE_ENVIRONMENT 应用设置。替换 <app_name> 占位符 。

  1. az webapp config appsettings set --name <app_name> --resource-group myResourceGroup --settings ASPNETCORE_ENVIRONMENT="Production"

若要了解如何在代码中引用环境变量,请参阅在生产环境中连接到 SQL 数据库

在生产环境中连接到 SQL 数据库Connect to SQL Database in production

在本地存储库中,打开 Startup.cs 并查找下列代码:

  1. services.AddDbContext<MyDatabaseContext>(options =>
  2. options.UseSqlite("Data Source=localdatabase.db"));

将其替换为下列代码,该代码使用之前配置的环境变量。

  1. // Use SQL Database if in Azure, otherwise, use SQLite
  2. if(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production")
  3. services.AddDbContext<MyDatabaseContext>(options =>
  4. options.UseSqlServer(Configuration.GetConnectionString("MyDbConnection")));
  5. else
  6. services.AddDbContext<MyDatabaseContext>(options =>
  7. options.UseSqlite("Data Source=localdatabase.db"));
  8. // Automatically perform database migration
  9. services.BuildServiceProvider().GetService<MyDatabaseContext>().Database.Migrate();

如果此代码检测到当前正在生产环境中运行(指 Azure 环境),则会使用已配置的连接字符串连接到 SQL 数据库。

在 Azure 中运行时可利用 Database.Migrate() 调用,因为它会根据迁移配置自动创建 .NET Core 应用所需的数据库。

重要

对于需要横向扩展的生产应用,请遵循在生产中应用迁移中的最佳做法。

保存所做的更改,然后将其提交到 Git 存储库。

  1. git add .
  2. git commit -m "connect to SQLDB in Azure"

从 Git 推送到 AzurePush to Azure from Git

回到本地终端窗口,将 Azure 远程功能添加到本地 Git 存储库。<deploymentLocalGitUrl-from-create-step> 替换为从创建 Web 应用保存的 Git 远程 URL。

  1. git remote add azure <deploymentLocalGitUrl-from-create-step>

使用以下命令推送到 Azure 远程库以部署应用。当 Git 凭据管理器提示输入凭据时,请确保输入在配置部署用户中创建的凭据,而不是用于登录到 Azure 门户的凭据。

  1. git push azure master

此命令可能需要花费几分钟时间运行。运行时,该命令会显示类似于以下示例的信息:

  1. Counting objects: 98, done.
  2. Delta compression using up to 8 threads.
  3. Compressing objects: 100% (92/92), done.
  4. Writing objects: 100% (98/98), 524.98 KiB | 5.58 MiB/s, done.
  5. Total 98 (delta 8), reused 0 (delta 0)
  6. remote: Updating branch 'master'.
  7. remote: .
  8. remote: Updating submodules.
  9. remote: Preparing deployment for commit id '0c497633b8'.
  10. remote: Generating deployment script.
  11. remote: Project file path: ./DotNetCoreSqlDb.csproj
  12. remote: Generated deployment script files
  13. remote: Running deployment command...
  14. remote: Handling ASP.NET Core Web Application deployment.
  15. remote: .
  16. remote: .
  17. remote: .
  18. remote: Finished successfully.
  19. remote: Running post deployment command(s)...
  20. remote: Deployment successful.
  21. remote: App container will begin restart within 10 seconds.
  22. To https://<app_name>.scm.azurewebsites.net/<app_name>.git
  23. * [new branch] master -> master

转到 Azure 应用Browse to the Azure app

使用 Web 浏览器转到已部署的应用。

  1. http://<app_name>.azurewebsites.net

添加几个待办事项。

在应用服务中运行的应用

祝贺你! 数据驱动的 .NET Core 应用已经在你的应用服务中运行了。

在本地更新并重新部署Update locally and redeploy

在此步骤中,将对数据库架构做出更改,并将其发布至 Azure。

更新数据模型Update your data model

在代码编辑器中打开 Models\Todo.cs将以下属性添加到 ToDo 类:

  1. public bool Done { get; set; }

本地运行 Code First 迁移Run Code First Migrations locally

运行以下命令更新本地数据库。

  1. dotnet ef migrations add AddProperty

更新本地数据库:

  1. dotnet ef database update

使用新属性Use the new property

为使用 Done 属性,需要对代码做一些更改。简单起见,本教程中将仅更改 IndexCreate 视图,以便在操作过程中查看属性。

打开 Controllers\TodosController.cs

找到 Create([Bind("ID,Description,CreatedDate")] Todo todo) 方法,并将 Done 添加到 Bind 属性中的属性列表。完成后,Create() 方法签名应如下面的代码所示:

  1. public async Task<IActionResult> Create([Bind("ID,Description,CreatedDate,Done")] Todo todo)

打开 Views\Todos\Create.cshtml

在 Razor 代码中,应能看到用于 Description<div class="form-group"> 元素,以及另一个用于 CreatedDate<div class="form-group"> 元素。紧跟在这两个元素之后,添加另一个用于 Done<div class="form-group"> 元素:

  1. <div class="form-group">
  2. <label asp-for="Done" class="col-md-2 control-label"></label>
  3. <div class="col-md-10">
  4. <input asp-for="Done" class="form-control" />
  5. <span asp-validation-for="Done" class="text-danger"></span>
  6. </div>
  7. </div>

打开 Views\Todos\Index.cshtml

搜索空的 <th></th> 元素。在此元素的正上方,添加下列 Razor 代码:

  1. <th>
  2. @Html.DisplayNameFor(model => model.Done)
  3. </th>

查找包含 asp-action 标记帮助程序的 <td> 元素。在此元素的正上方,添加下列 Razor 代码:

  1. <td>
  2. @Html.DisplayFor(modelItem => item.Done)
  3. </td>

这就是要在 IndexCreate 视图中查看更改所需的全部操作。

在本地测试更改Test your changes locally

在本地运行应用。

  1. dotnet run

在浏览器中,导航到 http://localhost:5000/你现在可以添加一个待办事项,并检查''Done'' 。然后,它会在主页中显示为已完成的项。请记住,由于未更改Edit视图,Edit视图不显示Done字段。

发布对 Azure 所做的更改Publish changes to Azure

  1. git add .
  2. git commit -m "added done field"
  3. git push azure master

git push 完成后,请导航至应用服务应用,尝试添加一个待办事项并选中“Done” 。

Code First 迁移后的 Azure 应用

所有现有待办事项仍将显示。重新发布 .NET Core 应用时,SQL 数据库中的现有数据不会丢失。此外,实体框架核心迁移仅更改数据架构,而使现有数据保持不变。

流式传输诊断日志Stream diagnostic logs

当 ASP.NET Core 应用在 Azure 应用服务中运行时,可以将控制台日志传输到 Cloud Shell。如此,可以获得相同的诊断消息,以便调试应用程序错误。

示例项目已遵循了 Azure 中的 ASP.NET Core 日志记录中的指南,并且进行了两个配置更改:

  • DotNetCoreSqlDb.csproj 中包含了对 Microsoft.Extensions.Logging.AzureAppServices 的引用。
  • Program.cs 中调用 loggerFactory.AddAzureWebAppDiagnostics()

若要将应用服务中的 ASP.NET Core 日志级别从默认级别 Error 设置为 Information,请在 Cloud Shell 中使用 az webapp log config 命令。

  1. az webapp log config --name <app_name> --resource-group myResourceGroup --application-logging true --level information

备注

项目的日志级别在 appsettings.json 中已设置为 Information

若要启动日志流式处理,请在 Cloud Shell 中使用 az webapp log tail 命令。

  1. az webapp log tail --name <app_name> --resource-group myResourceGroup

启动日志流式处理后,请在浏览器中刷新 Azure 应用,以获取一些 Web 流量。现在可以看到通过管道传送到终端的控制台日志。如果没有立即看到控制台日志,请在 30 秒后重新查看。

若要随时停止日志流式处理,请键入 Ctrl+C

有关自定义 ASP.NET Core 日志的详细信息,请参阅 ASP.NET Core 中的日志记录

管理 Azure 应用Manage your Azure app

若要查看所创建的应用,请在 Azure 门户中,搜索并选择“应用服务” "。

在 Azure 门户中选择应用服务

在“应用服务”页上,选择 Azure 应用的名称 。

在门户中导航到 Azure 应用

默认情况下,门户将显示应用的 “概述”页。在此页中可以查看应用的运行状况。在此处还可以执行基本的管理任务,例如浏览、停止、启动、重新启动和删除。该页左侧显示可以打开的不同配置页。

Azure 门户中的应用服务页

清理资源Clean up resources

在前面的步骤中,你在资源组中创建了 Azure 资源。如果认为将来不需要这些资源,请在 Cloud Shell 中运行以下命令删除资源组:

  1. az group delete --name myResourceGroup

此命令可能需要花费一点时间运行。

后续步骤Next steps

你已了解:

  • 在 Azure 中创建 SQL 数据库。
  • 将 .NET Core 应用连接到 SQL 数据库
  • 将应用部署到 Azure
  • 更新数据模型并重新部署应用
  • 将日志从 Azure 流式传输到终端
  • 在 Azure 门户中管理应用

继续学习下一篇教程,了解如何将自定义 DNS 名称映射到应用。

将现有的自定义 DNS 名称映射到 Azure 应用服务