教程:在 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 订阅,可以在开始前创建一个。
为完成此教程:
创建本地 .NET Core 应用Create local .NET Core app
在此步骤中,你将设置本地 .NET Core 项目。
克隆示例应用程序Clone the sample application
在终端窗口中,通过 转到工作目录。
运行以下命令来克隆示例存储库,并转到其根目录。
此示例项目包含使用 Entity Framework Core 的基本 CRUD(创建-读取-更新-删除)应用。
运行应用程序Run the application
运行以下命令,安装所需的包,运行数据库迁移并启动应用程序。
dotnet restore
dotnet ef database update
dotnet run
在浏览器中导航至 http://localhost:5000
。选择“新建” 链接,创建几个待办事项 。
在终端按 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,请执行以下操作:
若要在 Azure Cloud Shell 中运行本文中的代码,请执行以下操作:
启动 Cloud Shell。
选择代码块上的“复制”按钮 以复制代码。
在 Windows 和 Linux 上选择 Ctrl+Shift+V 将代码粘贴到 Cloud Shell 会话中,或在 macOS 上选择 Cmd+Shift+V 将代码粘贴到 Cloud Shell 会话中。
选择 Enter 运行此代码。
此步骤在 Azure 中创建一个 SQL 数据库。应用部署到 Azure 后,它将使用该云数据库。
对于 SQL 数据库,本教程使用 Azure SQL 数据库。
创建资源组Create a resource group
资源组是在其中部署和管理 Azure 资源(如 Web 应用、数据库和存储帐户)的逻辑容器。例如,可以选择在使用完之后通过一个简单的步骤删除整个资源组。
在 Cloud Shell 中,使用 命令创建资源组。以下示例在“西欧” 位置创建名为“myResourceGroup” 的资源组。要查看“免费”层中应用服务支持的所有位置,请运行 命令。az appservice list-locations —sku FREE
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> 分别替换为所选用户名和密码 。
az sql server create --name <server_name> --resource-group myResourceGroup --location "West Europe" --admin-user <db_username> --admin-password <db_password>
创建 SQL 数据库逻辑服务器后,Azure CLI 会显示类似于以下示例的信息:
{
"administratorLogin": "sqladmin",
"administratorLoginPassword": null,
"fullyQualifiedDomainName": "<server_name>.database.windows.net",
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Sql/servers/<server_name>",
"identity": null,
"kind": "v12.0",
"location": "westeurope",
"resourceGroup": "myResourceGroup",
"state": "Ready",
"tags": null,
"type": "Microsoft.Sql/servers",
"version": "12.0"
}
配置服务器防火墙规则Configure a server firewall rule
使用 az sql server firewall create
命令创建 。若同时将起始 IP 和结束 IP 设置为 0.0.0.0,防火墙将仅对其他 Azure 资源开启。
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
命令在服务器中创建 的数据库。
az sql db create --resource-group myResourceGroup --server <server_name> --name coreDB --service-objective S0
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 个字符,且具有字母、数字和符号这三种元素中的两种。
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
的应用服务计划:
az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE
创建应用服务计划后,Azure CLI 会显示类似于以下示例的信息:
{
"adminSiteName": null,
"appServicePlanName": "myAppServicePlan",
"geoRegion": "West Europe",
"hostingEnvironmentProfile": null,
"id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
"kind": "app",
"location": "West Europe",
"maximumNumberOfWorkers": 1,
"name": "myAppServicePlan",
< JSON data removed for brevity. >
"targetWorkerSizeId": 0,
"type": "Microsoft.Web/serverfarms",
"workerTierName": null
}
创建 Web 应用Create a web app
在 应用服务计划中创建一个 Web 应用myAppServicePlan
。
在 Cloud Shell 中可以使用 命令。在以下示例中,将 <app-name>
替换为全局唯一的应用名称(有效字符是 a-z
、0-9
和 )。
创建 Web 应用后,Azure CLI 会显示类似于以下示例的输出:
Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
"availabilityState": "Normal",
"clientAffinityEnabled": true,
"clientCertEnabled": false,
"clientCertExclusionPaths": null,
"cloningInfo": null,
"containerSize": 0,
"dailyMemoryTimeQuota": 0,
"defaultHostName": "<app-name>.azurewebsites.net",
"deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
"enabled": true,
< JSON data removed for brevity. >
}
备注
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> 参数替换为先前创建的连接字符串 。
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 值,相同的代码在部署时使用应用服务值。
若要了解如何在代码中引用连接字符串,请参阅。
配置环境变量Configure environment variable
接下来,将 ASPNETCORE_ENVIRONMENT
应用设置设置为“Production”。由于对本地开发环境使用 SQLite,并对 Azure 环境使用 SQL 数据库,因此通过此设置,你可以了解应用是否正在 Azure 中运行。
以下示例在 Azure 应用中配置 ASPNETCORE_ENVIRONMENT
应用设置。替换 <app_name> 占位符 。
az webapp config appsettings set --name <app_name> --resource-group myResourceGroup --settings ASPNETCORE_ENVIRONMENT="Production"
若要了解如何在代码中引用环境变量,请参阅。
在生产环境中连接到 SQL 数据库Connect to SQL Database in production
在本地存储库中,打开 Startup.cs 并查找下列代码:
services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlite("Data Source=localdatabase.db"));
将其替换为下列代码,该代码使用之前配置的环境变量。
// Use SQL Database if in Azure, otherwise, use SQLite
if(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production")
services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyDbConnection")));
else
services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlite("Data Source=localdatabase.db"));
// Automatically perform database migration
services.BuildServiceProvider().GetService<MyDatabaseContext>().Database.Migrate();
如果此代码检测到当前正在生产环境中运行(指 Azure 环境),则会使用已配置的连接字符串连接到 SQL 数据库。
在 Azure 中运行时可利用 Database.Migrate()
调用,因为它会根据迁移配置自动创建 .NET Core 应用所需的数据库。
重要
对于需要横向扩展的生产应用,请遵循中的最佳做法。
保存所做的更改,然后将其提交到 Git 存储库。
git commit -m "connect to SQLDB in Azure"
回到本地终端窗口,将 Azure 远程功能添加到本地 Git 存储库。将 <deploymentLocalGitUrl-from-create-step> 替换为从创建 Web 应用保存的 Git 远程 URL。
git remote add azure <deploymentLocalGitUrl-from-create-step>
使用以下命令推送到 Azure 远程库以部署应用。当 Git 凭据管理器提示输入凭据时,请确保输入在中创建的凭据,而不是用于登录到 Azure 门户的凭据。
git push azure master
此命令可能需要花费几分钟时间运行。运行时,该命令会显示类似于以下示例的信息:
Counting objects: 98, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (92/92), done.
Writing objects: 100% (98/98), 524.98 KiB | 5.58 MiB/s, done.
Total 98 (delta 8), reused 0 (delta 0)
remote: Updating branch 'master'.
remote: .
remote: Updating submodules.
remote: Preparing deployment for commit id '0c497633b8'.
remote: Generating deployment script.
remote: Project file path: ./DotNetCoreSqlDb.csproj
remote: Generated deployment script files
remote: Running deployment command...
remote: Handling ASP.NET Core Web Application deployment.
remote: .
remote: .
remote: .
remote: Finished successfully.
remote: Deployment successful.
remote: App container will begin restart within 10 seconds.
To https://<app_name>.scm.azurewebsites.net/<app_name>.git
* [new branch] master -> master
转到 Azure 应用Browse to the Azure app
使用 Web 浏览器转到已部署的应用。
http://<app_name>.azurewebsites.net
添加几个待办事项。
祝贺你! 数据驱动的 .NET Core 应用已经在你的应用服务中运行了。
在本地更新并重新部署Update locally and redeploy
在此步骤中,将对数据库架构做出更改,并将其发布至 Azure。
更新数据模型Update your data model
在代码编辑器中打开 Models\Todo.cs。将以下属性添加到 ToDo
类:
本地运行 Code First 迁移Run Code First Migrations locally
dotnet ef migrations add AddProperty
更新本地数据库:
dotnet ef database update
使用新属性Use the new property
为使用 Done
属性,需要对代码做一些更改。简单起见,本教程中将仅更改 Index
和 Create
视图,以便在操作过程中查看属性。
打开 Controllers\TodosController.cs。
找到 Create([Bind("ID,Description,CreatedDate")] Todo todo)
方法,并将 Done
添加到 Bind
属性中的属性列表。完成后,Create()
方法签名应如下面的代码所示:
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">
元素:
<div class="form-group">
<label asp-for="Done" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Done" class="form-control" />
<span asp-validation-for="Done" class="text-danger"></span>
</div>
</div>
打开 Views\Todos\Index.cshtml。
搜索空的 <th></th>
元素。在此元素的正上方,添加下列 Razor 代码:
<th>
@Html.DisplayNameFor(model => model.Done)
</th>
查找包含 asp-action
标记帮助程序的 <td>
元素。在此元素的正上方,添加下列 Razor 代码:
<td>
@Html.DisplayFor(modelItem => item.Done)
</td>
这就是要在 Index
和 Create
视图中查看更改所需的全部操作。
在本地测试更改Test your changes locally
在本地运行应用。
dotnet run
在浏览器中,导航到 http://localhost:5000/
。你现在可以添加一个待办事项,并检查''Done'' 。然后,它会在主页中显示为已完成的项。请记住,由于未更改Edit
视图,Edit
视图不显示Done
字段。
发布对 Azure 所做的更改Publish changes to Azure
git add .
git commit -m "added done field"
git push azure master
git push
完成后,请导航至应用服务应用,尝试添加一个待办事项并选中“Done” 。
所有现有待办事项仍将显示。重新发布 .NET Core 应用时,SQL 数据库中的现有数据不会丢失。此外,实体框架核心迁移仅更改数据架构,而使现有数据保持不变。
当 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
命令。
az webapp log config --name <app_name> --resource-group myResourceGroup --application-logging true --level information
备注
项目的日志级别在 appsettings.json 中已设置为 Information
。
若要启动日志流式处理,请在 Cloud Shell 中使用 命令。
az webapp log tail --name <app_name> --resource-group myResourceGroup
启动日志流式处理后,请在浏览器中刷新 Azure 应用,以获取一些 Web 流量。现在可以看到通过管道传送到终端的控制台日志。如果没有立即看到控制台日志,请在 30 秒后重新查看。
若要随时停止日志流式处理,请键入 +C
。
有关自定义 ASP.NET Core 日志的详细信息,请参阅 ASP.NET Core 中的日志记录。
管理 Azure 应用Manage your Azure app
若要查看所创建的应用,请在 Azure 门户中,搜索并选择“应用服务” "。
在“应用服务”页上,选择 Azure 应用的名称 。
默认情况下,门户将显示应用的 “概述”页。在此页中可以查看应用的运行状况。在此处还可以执行基本的管理任务,例如浏览、停止、启动、重新启动和删除。该页左侧显示可以打开的不同配置页。
清理资源Clean up resources
在前面的步骤中,你在资源组中创建了 Azure 资源。如果认为将来不需要这些资源,请在 Cloud Shell 中运行以下命令删除资源组:
此命令可能需要花费一点时间运行。
你已了解:
- 在 Azure 中创建 SQL 数据库。
- 将 .NET Core 应用连接到 SQL 数据库
- 将应用部署到 Azure
- 更新数据模型并重新部署应用
- 将日志从 Azure 流式传输到终端
继续学习下一篇教程,了解如何将自定义 DNS 名称映射到应用。