技术帖 | 在 Azure 应用服务中生成 .NET Core 和 SQL 数据库 Web 应用
Posted 微软中国MSDN
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术帖 | 在 Azure 应用服务中生成 .NET Core 和 SQL 数据库 Web 应用相关的知识,希望对你有一定的参考价值。
应用服务在Azure 中提供高度可缩放、自修补的Web 托管服务。 本教程演示如何创建.NET Core Web 应用,并将其连接至SQL 数据库。 完成操作后,将拥有一个在应用服务中运行的.NET Core MVC 应用。
学习如何:
在 Azure 中创建 SQL 数据库。
将 .NET Core 应用连接到 SQL 数据库
将应用部署到 Azure
更新数据模型并重新部署应用
从 Azure 流式传输诊断日志
在 Azure 门户中管理应用
先决条件:
1. 安装 Git
2. 安装 .NET Core SDK1.1.2
如果还没有 Azure 订阅,可以在开始前创建一个 免费帐户。
创建本地 .NET Core 应用:
在此步骤中,将设置本地.NET Core 项目。
克隆示例应用程序:
在终端窗口中,通过 cd
转到工作目录。
运行以下命令来克隆示例存储库,并更改为其根。
git clone https://github.com/azure-samples/dotnetcore-sqldb-tutorialcd dotnetcore-sqldb-tutorial
此示例项目包含使用实体框架核心的基本 CRUD(创建-读取-更新-删除)应用。
运行应用程序:
运行以下命令,安装所需的包,运行数据库迁移并启动应用程序。
dotnet restore
dotnet ef database update
dotnet run
在浏览器中导航至 http://localhost:5000
。 选择“新建”链接,创建一对待办事项。
在终端按 Ctrl+C
,随时停止 .NET Core。
启动 Azure Cloud Shell
Azure Cloud Shell 是免费的交互式 shell,可以使用它运行本文中的步骤。 它预安装有常用 Azure 工具并将其配置与帐户一起使用。 请直接单击“复制”对代码进行复制,将其粘贴到 Cloud Shell 中,然后按 Enter 来运行它。 可通过多种方式来启动 Cloud Shell:
单击代码块右上角的“试用”。 | |
在浏览器中打开 Cloud Shell。 | |
单击 Azure 门户右上角菜单上的“Cloud Shell”按钮。 |
创建生产 SQL 数据库
此步骤在 Azure 中创建一个 SQL 数据库。 应用部署到 Azure 后,它将使用该云数据库。
对于 SQL 数据库,本教程使用 Azure SQL 数据库。
资源组是在其中部署和管理 Azure 资源(如 Web 应用、数据库和存储帐户)的逻辑容器。
以下示例在“西欧”位置创建名为“myResourceGroup”的资源组。 若要查看应用服务支持的所有位置,请运行 az appservice list-locations
命令。
az group create --name myResourceGroup --location "West Europe"
通常在附近的区域中创建资源组和资源。
创建 SQL 数据库逻辑服务器
在 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", "name": "<server_name>", "resourceGroup": "myResourceGroup", "state": "Ready", "tags": null, "type": "Microsoft.Sql/servers", "version": "12.0"}
配置服务器防火墙规则
使用 az sql server firewall create 命令创建 Azure SQL 数据库服务器级防火墙规则。若同时将起始 IP 和结束 IP 设置为 0.0.0.0,防火墙将仅对其他 Azure 资源开启。
az sql server firewall-rule create --resource-group myResourceGroup --server <server_name> --name AllowYourIp --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
创建数据库
使用 az sql db create 命令在服务器中创建 S0 性能级别的数据库。
az sql db create --resource-group myResourceGroup --server <server_name> --name coreDB --service-objective S0
创建连接字符串
将下列字符串替换为先前所使用的 <server_name>、<db_username> 和 <db_password>。
Server=tcp:<server_name>.database.windows.net,1433;Initial Catalog=coreDB;Persist Security Info=False;User ID=<db_username>;Password=<db_password>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
这是 .NET Core 应用的连接字符串。 将其进行复制,留待稍后使用。
将应用部署到 Azure
在此步骤中,将已连接 SQL 数据库的 .NET Core 应用程序部署到应用服务。
配置本地 Git 部署
在 Cloud Shell 中,使用 az webapp deployment user set 命令创建部署凭据。 对 Web 应用进行 FTP 和本地 Git 部署时需要一个部署用户。 用户名和密码都为帐户级别。 它们与 Azure 订阅凭据不同。
在以下示例中,将 <username> 和 <password>(包括括号)替换为新的用户名和密码。 用户名必须唯一。 密码长度必须至少为 8 个字符,其中包含以下 3 种元素中的两种:字母、数字、符号。
az webapp deployment user set --user-name <username> --password <password>
如果收到 'Conflict'. Details: 409
错误,请更改用户名。 如果收到 'Bad Request'. Details: 400
错误,请使用更强的密码。
只创建此部署用户一次;可对所有 Azure 部署使用此用户。
--备注--
记录用户名和密码。 之后需要它们来部署 Web 应用。
创建应用服务计划
在 Cloud Shell 中,使用 az appservice plan create 命令创建应用服务计划。
应用服务计划指定托管应用的 Web 服务器场的位置、大小和功能。 可以在托管多个应用时节省资金,方法是将多个 Web 应用配置为共用单个应用服务计划。
应用服务计划定义:
区域(例如:北欧、美国东部或东南亚)
实例大小(小、中、大)
规模计数(1 到 20 个实例)
SKU(免费、共享、基本、标准、高级)
以下示例在免费定价层中创建名为 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 应用
在 Cloud Shell 中,使用 az webapp create 命令在 myAppServicePlan
应用服务计划中创建一个 Web 应用。
在以下示例中,将 <app_name>
替换为全局唯一的应用名称(有效字符是 a-z
、0-9
和 -
)。
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app_name> --deployment-local-git
创建 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, "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. >
}
已在 Linux 容器中创建了空的 Web 应用并启用了 Git 部署。
--备注--
Git 远程的 URL 将显示在 deploymentLocalGitUrl
属性中,其格式为 https://<username>@<app_name>.scm.azurewebsites.net/<app_name>.git
。 保存此 URL,因为稍后将需要它。
配置环境变量
要为 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
接下来,将 ASPNETCORE_ENVIRONMENT
应用设置设置为_生产_。 由于对本地开发环境使用 SQLite,并对 Azure 环境使用 SQL 数据库,因此通过此设置,可了解是否正在 Azure 中运行。
下面的示例在 Azure Web 应用中配置 ASPNETCORE_ENVIRONMENT
应用设置, 替换 <app_name> 占位符。
az webapp config appsettings set --name <app_name> --resource-group myResourceGroup --settings ASPNETCORE_ENVIRONMENT="Production"
在生产中连接到 SQL 数据库
在本地存储库中,打开 Startup.cs 并查找下列代码:
services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlite("Data Source=localdatabase.db"));
将其替换为下列代码,该代码使用之前配置的环境变量。
// Use SQL Database if in Azure, otherwise, use SQLiteif(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production")
services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyDbConnection")));else
services.AddDbContext<MyDatabaseContext>(options =>
options.UseSqlite("Data Source=MvcMovie.db"));// Automatically perform database migrationservices.BuildServiceProvider().GetService<MyDatabaseContext>().Database.Migrate();
如果此代码检测到当前正在生产中运行(指 Azure 环境),则会使用先前配置的连接字符串连接到 SQL 数据库。
在 Azure 中运行时可利用 Database.Migrate()
调用,因为它会根据迁移配置自动创建 .NET Core 应用所需的数据库。
保存所做的更改,然后将其提交到 Git 存储库。
git commit -am "connect to SQLDB in Azure"
从 Git 推送到 Azure
在本地终端窗口中,将 Azure 远程功能添加到本地 Git 存储库。 将 <paste_copied_url_here> 替换为从创建 Web 应用保存的 Git 远程 URL。
git remote add azure <deploymentLocalGitUrl-from-create-step>
使用以下命令推送到 Azure 远程功能以部署应用。 提示输入密码时,请确保输入在配置部署用户中创建的密码,而不是用于登录到 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: Running post deployment command(s)...
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 Web 应用
使用 Web 浏览器浏览到已部署的 Web 应用。
http://<app_name>.azurewebsites.net
添加几个待办事项。
祝贺你! 正在应用服务中运行数据驱动的 .NET Core 应用。
在本地更新并重新部署
在此步骤中,将对数据库架构做出更改,并将其发布至 Azure。
更新数据模型
在代码编辑器中打开 ModelsTodo.cs。 将以下属性添加到 ToDo
类:
public bool Done { get; set; }
本地运行 Code First 迁移
运行几个命令更新本地数据库。
dotnet ef migrations add AddProperty
更新本地数据库:
dotnet ef database update
使用新属性
为使用 Done
属性,需要对代码做更多更改。 简单起见,本教程中将仅更改 Index
和 Create
视图,以便在操作中查看属性。
打开 ControllersTodosController.cs。
找到 Create()
方法,并将 Done
添加到 Bind
属性中的属性列表。 完成后,Create()
方法签名应如下代码所示:
public async Task<IActionResult> Create([Bind("ID,Description,CreatedDate,Done")] Todo todo)
打开 ViewsTodosCreate.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>
打开 ViewsTodosIndex.cshtml。
搜索空的 <th></th>
元素。 在此元素的正上方,添加下列 Razor 代码:
<th>
@Html.DisplayNameFor(model => model.Done)
</th>
查找包含 asp-action
标记帮助程序的 <td>
元素。 在此元素的正上方,添加下列 Razor 代码:
<td>
@Html.DisplayFor(modelItem => item.CreatedDate)
</td>
这就是要在 Index
和 Create
视图中查看更改所需的全部操作。
在本地测试更改
在本地运行应用。
dotnet run
在浏览器中,导航到 http://localhost:5000/
。 你现在可以添加一个待办事项,并检查“完成”。 然后,它应作为已完成项在主页中显示。 请牢记,由于未更改Edit
视图,Edit
视图不显示Done
字段。
发布对 Azure 所做的更改
git commit -am "added done field"git push azure master
一旦 git push
完成,请导航至 Azure Web 应用,试用新功能。
所有现有待办事项仍将显示。 重新发布 .NET Core 应用时,SQL 数据库中的现有数据不会丢失。 此外,实体框架核心迁移仅更改数据架构,而使现有数据保持不变。
管理 Azure Web 应用
转到 Azure 门户查看已创建的 Web 应用。
从左侧菜单中单击“应用服务”,并单击 Azure Web 应用的名称。
默认情况下,门户将显示 Web 应用“概述”页。 在此页中可以查看应用的运行状况。在此处还可以执行基本的管理任务,例如浏览、停止、启动、重新启动和删除。 该页左侧的选项卡显示可以打开的不同配置页。
清理资源
在前面的步骤中,在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在 Cloud Shell 中运行以下命令删除资源组:
az group delete --name myResourceGroup
此命令可能需要花费一分钟时间运行。
后续步骤
你已了解:
在 Azure 中创建 SQL 数据库。
将 .NET Core 应用连接到 SQL 数据库
将应用部署到 Azure
更新数据模型并重新部署应用
将日志从 Azure 流式传输到终端
在 Azure 门户中管理应用
以上是关于技术帖 | 在 Azure 应用服务中生成 .NET Core 和 SQL 数据库 Web 应用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中生成 Azure blob SAS URL?
无法使用 Microsoft 示例在 Azure APIM 中生成 SAS
任务 - 在 Azure Synapse Serverless SQL 中生成脚本