备注
本文将应用部署到 Windows 上的应用服务。 若要部署到 Linux 上的应用服务,请参阅在 Linux 上的 Azure 应用服务中生成 .NET Core 和 SQL 数据库应用。
应用服务在 Azure 中提供高度可缩放、自修补的 Web 托管服务。 本教程演示如何创建 .NET Core 应用,并将其连接至 SQL 数据库。 完成操作后,将拥有一个在应用服务中运行的 .NET Core MVC 应用。
你将学习如何:
如果还没有 Azure 订阅,可以在开始前创建一个免费帐户。
为完成此教程:
在此步骤中,你将设置本地 .NET Core 项目。
在终端窗口中,通过 cd
转到工作目录。
运行以下命令来克隆示例存储库,并转到其根目录。
git clone https://github.com/azure-samples/dotnetcore-sqldb-tutorial cd dotnetcore-sqldb-tutorial
此示例项目包含使用 Entity Framework Core 的基本 CRUD(创建-读取-更新-删除)应用。
运行以下命令,安装所需的包,运行数据库迁移并启动应用程序。
dotnet restore dotnet ef database update dotnet run
在浏览器中导航至 http://localhost:5000
。 选择“新建” 链接,创建几个待办事项 。
在终端按 Ctrl+C
,随时停止 .NET Core。
Azure 托管 Azure Cloud Shell(一个可通过浏览器使用的交互式 shell 环境)。 可以将 Bash 或 PowerShell 与 Cloud Shell 配合使用来使用 Azure 服务。 可以使用 Azure Cloud Shell 预安装的命令来运行本文中的代码,而不必在本地环境中安装任何内容。
若要启动 Azure Cloud Shell,请执行以下操作:
选项 | 示例/链接 |
---|---|
选择代码块右上角的“试用”。 选择“试用” 不会自动将代码复制到 Cloud Shell。 | |
转到 https://shell.azure.com 或选择“启动 Cloud Shell” 按钮可在浏览器中打开 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 数据库。
资源组是在其中部署和管理 Azure 资源(如 Web 应用、数据库和存储帐户)的逻辑容器。 例如,可以选择在使用完之后通过一个简单的步骤删除整个资源组。
在 Cloud Shell 中,使用 az group create
命令创建资源组。 以下示例在“西欧” 位置创建名为“myResourceGroup” 的资源组。 要查看“免费”层中应用服务支持的所有位置,请运行 az appservice list-locations --sku FREE
命令。
az group create --name myResourceGroup --location "West Europe"
通常在附近的区域中创建资源组和资源。
此命令完成后,JSON 输出会显示资源组属性。
在 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 AllowAllIps --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
提示
你甚至可以让防火墙规则更严格,即只使用应用所使用的出站 IP 地址。
使用 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;Database=coreDB;User ID=<db_username>;Password=<db_password>;Encrypt=true;Connection Timeout=30;
这是 .NET Core 应用的连接字符串。 将其进行复制,留待稍后使用。
在此步骤中,将已连接 SQL 数据库的 .NET Core 应用程序部署到应用服务。
可以使用“部署用户” 将 FTP 和本地 Git 部署到 Azure Web 应用。 配置部署用户之后,可对所有 Azure 部署使用此用户。 帐户级部署用户名和密码不同于 Azure 订阅凭据。
若要配置部署用户,请在 Azure Cloud Shell 中运行 az webapp deployment user set 命令。 将 <username> 和 <password> 替换为部署用户名和密码。
az webapp deployment user set --user-name <username> --password <password>
JSON 输出会将该密码显示为 null
。 如果收到 'Conflict'. Details: 409
错误,请更改用户名。 如果收到 'Bad Request'. Details: 400
错误,请使用更强的密码。
请记录你要用于部署 Web 应用的用户名和密码。
在 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 }
在 myAppServicePlan
应用服务计划中创建一个 Web 应用。
在 Cloud Shell 中可以使用 az webapp create
命令。 在以下示例中,将 <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, "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,因为后面需要它。
若要为 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 值,相同的代码在部署时使用应用服务值。
若要了解如何在代码中引用连接字符串,请参阅在生产环境中连接到 SQL 数据库。
接下来,将 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 数据库。
在本地存储库中,打开 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 add . 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: 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
使用 Web 浏览器转到已部署的应用。
http://<app_name>.azurewebsites.net
添加几个待办事项。
祝贺你! 数据驱动的 .NET Core 应用已经在你的应用服务中运行了。
在此步骤中,将对数据库架构做出更改,并将其发布至 Azure。
在代码编辑器中打开 Models\Todo.cs。 将以下属性添加到 ToDo
类:
public bool Done { get; set; }
运行以下命令更新本地数据库。
dotnet ef migrations add AddProperty
更新本地数据库:
dotnet ef database update
为使用 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
视图中查看更改所需的全部操作。
在本地运行应用。
dotnet run
在浏览器中,导航到 http://localhost:5000/
。 你现在可以添加一个待办事项,并检查''Done'' 。 然后,它会在主页中显示为已完成的项。 请记住,由于未更改Edit
视图,Edit
视图不显示Done
字段。
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 日志记录中的指南,并且进行了两个配置更改:
Microsoft.Extensions.Logging.AzureAppServices
的引用。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
命令。
az webapp log tail --name <app_name> --resource-group myResourceGroup
启动日志流式处理后,请在浏览器中刷新 Azure 应用,以获取一些 Web 流量。 现在可以看到通过管道传送到终端的控制台日志。 如果没有立即看到控制台日志,请在 30 秒后重新查看。
若要随时停止日志流式处理,请键入 Ctrl
+C
。
有关自定义 ASP.NET Core 日志的详细信息,请参阅 ASP.NET Core 中的日志记录。
若要查看所创建的应用,请在 Azure 门户中,搜索并选择“应用服务” "。
在“应用服务”页上,选择 Azure 应用的名称 。
默认情况下,门户将显示应用的 “概述”页。 在此页中可以查看应用的运行状况。 在此处还可以执行基本的管理任务,例如浏览、停止、启动、重新启动和删除。 该页左侧显示可以打开的不同配置页。
在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在 Cloud Shell 中运行以下命令删除资源组:
az group delete --name myResourceGroup
此命令可能需要花费一点时间运行。
你已了解:
继续学习下一篇教程,了解如何将自定义 DNS 名称映射到应用。