Azure 应用服务提供高度可缩放、自修复的 Web 托管服务。 本教程演示如何在应用服务中部署数据驱动的 ASP.NET 应用,以及如何将其连接到 Azure SQL 数据库。
完成本教程后,ASP.NET 应用连接到 Azure 中运行的 Azure SQL 数据库。 以下示例显示了应用界面。
在本教程中,你将:
- 将数据驱动的 Web 应用发布到 Azure。
- 创建一个 Azure SQL 数据库来保存应用数据。
- 将 ASP.NET 应用连接到 Azure SQL 数据库。
- 为数据库连接配置托管标识和Microsoft Entra ID 身份验证。
- 更新数据模型并重新部署应用。
- 将应用程序日志从 Azure 流式传输到 Visual Studio。
- 如果没有 Azure 试用版订阅,请在开始前创建一个。
- 安装 Visual Studio 2022,其中包含 ASP.NET 和 Web 开发以及 Azure 开发工作负载。
- 可以通过在 Visual Studio 工具菜单中选择“获取工具和功能”,将工作负载添加到现有的 Visual Studio 安装。
- 如有必要,请选择 “帮助>检查更新 ”并安装最新版本,确保具有 Visual Studio 2022 的最新更新。
示例项目包含使用 Entity Framework Code First 的基本 ASP.NET MVC create-read-update-delete (CRUD) 应用。
下载 示例项目 并提取 dotnet-sqldb-tutorial-master.zip 文件。
在 Visual Studio 中打开提取的 dotnet-sqldb-tutorial-master/DotNetAppSqlDb.sln 文件。
按 F5 运行应用并在默认浏览器中打开它。
备注
如有必要, 请安装任何缺少的 NuGet 包。
在应用中,选择“ 新建 ”并创建几个 to-do 项。
测试“编辑”、“详细信息”和“删除”链接。
若要将应用发布到 Azure,请创建并配置具有 Azure 应用服务和应用服务计划的发布配置文件来托管应用。 然后,创建一个 Azure SQL Server 和 Azure SQL 数据库以包含应用数据,并配置数据库上下文以将应用与数据库连接。
在 Visual Studio 解决方案资源管理器中,右键单击 DotNetAppSqlDb 项目并选择“ 发布”。
在 “发布 ”屏幕上,选择 Azure 作为目标,然后选择“ 下一步”。
在下一个屏幕上,确保已选择 Azure 应用服务(Windows), 然后选择“ 下一步”。
在下一个 “发布 ”屏幕上,登录到Microsoft帐户和要使用的订阅。
在 应用服务旁边,选择“ 新建”。
在 应用服务(Windows) 屏幕上,配置应用服务 名称、 资源组和 托管计划。
在 “名称”下,可以保留生成的 Web 应用名称,或者将其更改为包含字符
a-z
的另一个名称,0-9
以及-
。 Web 应用名称在所有 Azure 应用中必须是唯一的。在 资源组旁边,选择“ 新建”,并将资源组命名 为 myResourceGroup。
资源组是在其中部署和管理 Azure 资源(例如 Web 应用、数据库和存储帐户)的逻辑容器。 例如,可以选择在使用完之后通过一个简单的步骤删除整个资源组。
在“托管计划”旁边,选择“新建”。
应用服务计划指定托管应用的 Web 服务器场的位置、大小和功能。 可以在托管多个应用时节省资金,方法是将多个 Web 应用配置为共用一个应用服务计划。
应用服务计划定义:
- 区域(例如:中国东部、中国东部 2、中国北部、中国北部 2、中国北部 3)
- 实例大小(小、中、大)
- 规模计数(1 到 20 个实例)
- SKU(免费、共享、基本、标准、高级)
完成 “托管计划” 屏幕,然后选择“ 确定”。
在 应用服务(Windows) 屏幕上,选择“ 创建”,并等待 Azure 资源创建。
“ 发布” 屏幕显示配置的资源。 选择“完成”,然后选择“关闭”。
在创建数据库之前,您需要一个逻辑 SQL 服务器。 逻辑 SQL 服务器是一种逻辑构造,其中包含一组作为组管理的数据库。
在 DotNetAppSqlDb 应用的“发布”屏幕上,在“服务依赖项”部分中,选择 SQL Server 数据库旁边的省略号...,然后选择“连接”。
备注
请务必从 “发布 ”选项卡配置 SQL 数据库,而不是 “连接服务 ”选项卡。
在 “连接到依赖项 ”屏幕上,选择 “Azure SQL 数据库 ”,然后选择“ 下一步”。
在 “配置 Azure SQL 数据库 ”屏幕上,选择“ 新建”。
在 “Azure SQL 数据库 ”屏幕上的 “数据库服务器”旁边,选择“ 新建”。
将服务器名称更改为所需的值。 服务器名称在 Azure SQL 中的所有服务器中必须是唯一的。
选择“确定”。
在 Azure SQL 数据库 屏幕上,保留默认生成的 数据库名称。 选择创建并等待创建数据库资源。
创建数据库资源时,选择“ 下一步”。
在 “连接到 Azure SQL 数据库 ”屏幕上,选择“ 完成”。
备注
如果您看到的是 本地用户机密文件,请确保使用 发布 页面,而不是 连接服务 页面来进行 SQL 数据库配置。
Azure SQL 数据库连接现已设置为使用 Azure 服务的托管标识,这是将应用连接到不使用机密或密码的 Azure 资源的安全方法。 现在,需要针对与此托管标识对应的 SQL 用户设置适当的权限,以便连接正常工作。
当 Azure SQL 数据库创建向导使用托管标识和 Entra ID 默认身份验证设置 Azure SQL 服务器时,它会将 Entra ID 帐户添加为 Azure SQL 管理员。如果登录到 Visual Studio 中的同一帐户,则可以使用相同的连接字符串连接到 Visual Studio 和 Azure 中的数据库。
在“工具”菜单中,选择“NuGet 包管理器”“包管理器控制台”。
在 包管理器控制台中,安装以下包:
Install-Package Microsoft.Data.SqlClient Install-Package Microsoft.EntityFramework.SqlServer
在 PowerShell 命令行中,运行以下命令以登录到 SQL 数据库,将其替换为
<server-name>
服务器名称和<entra-id-user>
用于在 Visual Studio 中设置数据库的 Microsoft Entra 用户名。 默认情况下,Entra 用户具有对数据库服务器的管理员访问权限。sqlcmd -S <servername>.database.chinacloudapi.cn -d DotNetAppSqlDb_db -U <entra-id-user> -G -l 30
按提示登录。
在 SQL 提示符下运行以下命令,以授予应用所需的最低权限,并
<app-name>
替换为应用名称。CREATE USER [<app-name>] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [<app-name>]; ALTER ROLE db_datawriter ADD MEMBER [<app-name>]; ALTER ROLE db_ddladmin ADD MEMBER [<app-name>]; GO
应用使用数据库上下文连接至在 Models/MyDatabaseContext.cs 文件中引用的数据库。 在本部分中,您需要更新代码以引用 Entity Framework 6 SQL Server 提供程序,该提供程序依赖于最新的 Microsoft.Data.SqlClient ADO.NET 提供程序。
Entity Framework 6 提供程序取代了内置的 System.Data.SqlClient
SQL Server 提供程序,并包括对 Microsoft Entra ID 身份验证方法的支持。 有关详细信息,请参阅 Microsoft.EntityFramework.SqlServer}。
[DbConfigurationType(typeof(MicrosoftSqlDbConfiguration))]
在本地用于Microsoft.Data.SqlClient
数据库上下文,但由于Azure应用服务中System.Data.SqlClient
被硬编码为提供程序,因此需要扩展MicrosoftSqlDbConfiguration
以将System.Data.SqlClient
的引用重定向到Microsoft.Data.SqlClient
。
在 web.config中,删除
entityFramework/providers/provider
部分和行:<provider invariantName="System.Data.SqlClient" .../>
在 Models/MyDatabaseContext.cs 中,添加以下类:
public class AppServiceConfiguration : MicrosoftSqlDbConfiguration { public AppServiceConfiguration() { SetProviderFactory("System.Data.SqlClient", Microsoft.Data.SqlClient.SqlClientFactory.Instance); SetProviderServices("System.Data.SqlClient", MicrosoftSqlProviderServices.Instance); SetExecutionStrategy("System.Data.SqlClient", () => new MicrosoftSqlAzureExecutionStrategy()); } }
将以下属性添加到
MyDatabaseContext
类声明:[DbConfigurationType(typeof(AppServiceConfiguration))]
在“ 发布 ”选项卡顶部,选择“ 发布”。 ASP.NET 应用部署到 Azure,默认浏览器将启动到已部署应用的 URL。
若要测试应用,请添加几个 to-do 项。
祝贺你! 数据驱动 ASP.NET 应用程序当前在 Azure 应用服务中实时运行。
可以使用 Visual Studio SQL Server 对象资源管理器 轻松浏览和管理 Azure SQL 数据库。 在 SQL Server 对象资源管理器中,可以执行最常见的数据库作,例如运行查询或创建表、视图和存储过程。
默认情况下,Azure 服务器仅允许从 Azure 服务(例如 Azure 应用)连接到其数据库。 新数据库将其防火墙打开到你创建的应用服务应用。
若要从本地计算机(例如 Visual Studio)访问数据库,Azure 服务器必须打开防火墙才能允许访问计算机的公共 IP 地址。
如果系统提示添加本地客户端的访问权限,请确保选择“ 允许计算机的公共 IP 地址”选项。 此选项创建防火墙规则以允许本地计算机的公共 IP 地址。 该对话框已使用计算机的当前 IP 地址填充。
如果没有提示添加本地计算机的访问权限,可以在 Azure 门户中转到 Azure SQL 数据库,然后在顶部菜单栏中选择 “设置服务器防火墙 ”。 在防火墙规则下的“网络”页上,选择用于添加客户端 IPv4 地址的选项。
备注
如果您的 internet 服务提供商更改了您的公共 IP 地址,则需要重新配置防火墙以再次访问 Azure 数据库。
在“视图”菜单中,选择“SQL Server 对象资源管理器”。
在 “SQL Server 对象资源管理器” 窗口顶部,选择用于 添加 SQL Server 的图标。
在 “连接” 屏幕上,连接显示在 Azure 节点下。 完成 服务器名称、 用户名、 密码和 数据库名称的信息,然后选择“ 连接”。
Visual Studio 完成 SQL 数据库实例的连接配置后,数据库会显示在 SQL Server 对象资源管理器中。 展开 <连接名称>>“数据库><名称>> ”以查看数据。
展开 表,右键单击
ToDoes
该表,然后选择“ 查看数据 ”以与数据库数据交互。
可以使用 Visual Studio 中的熟悉工具在 Azure 中更新数据库和应用。 在此步骤中,将使用 Entity Framework 中的 Code First 迁移来更改数据库架构并将更改发布到 Azure。
有关使用 Entity Framework Code First 迁移的详细信息,请参阅使用 MVC 5 的 Entity Framework 6 Code First 入门。
在代码编辑器中打开 Models\Todo.cs。 将以下属性添加到 ToDo
类:
public bool Done { get; set; }
运行几个命令来更新本地数据库。
在“工具”菜单中,选择“NuGet 包管理器”“包管理器控制台”。
在“程序包管理器控制台”窗口中,启用“Code First 迁移”:
Enable-Migrations
添加迁移:
Add-Migration AddProperty
更新本地数据库:
Update-Database
按 Ctrl+F5 运行应用。 测试 “编辑”、“ 详细信息”和 “创建新 ”链接。
如果应用程序加载时未出错,则 Code First 迁移成功。 但页面看上去仍没有变化,这是因为应用程序逻辑尚未使用新属性。
在代码中进行一些更改,以查看该 Done
属性的作用。 在本教程中,仅更改Index
和Create
视图以使用新属性。
打开Controllers\TodosController.cs文件,在第52行的
Create()
方法中,将Done
添加到Bind
属性中的属性列表中。 方法Create()
签名应类似于以下代码:public ActionResult Create([Bind(Include = "Description,CreatedDate,Done")] Todo todo)
打开 Views\Todos\Create.cshtml,并在 Razor 代码中,注意使用
model.Description
的<div class="form-group">
元素和使用model.CreatedDate
的<div class="form-group">
元素。在这两个元素之后,添加以下使用
model.Done
的<div class="form-group">
元素:<div class="form-group"> @Html.LabelFor(model => model.Done, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> <div class="checkbox"> @Html.EditorFor(model => model.Done) @Html.ValidationMessageFor(model => model.Done, "", new { @class = "text-danger" }) </div> </div> </div>
打开 Views\Todos\Index.cshtml,并在空
<th></th>
元素上方添加以下 Razor 代码:<th> @Html.DisplayNameFor(model => model.Done) </th>
在包含
Html.ActionLink()
辅助方法的<td>
元素上方,添加一个包含以下 Razor 代码的<td>
元素:<td> @Html.DisplayFor(modelItem => item.Done) </td>
保存所有文件,然后按 Ctrl+F5 运行应用。
在应用中,添加 to-do 项,然后选择“ 完成”。 该项应作为已完成的项显示在主页上。 “编辑”视图不显示“完成”字段,因为你没有更改“编辑”视图。
现在,你的代码更改已成功运行,包括数据库迁移,你可以将其发布到 Azure 应用,并使用 Code First 迁移更新 Azure SQL 数据库。
在 Visual Studio 解决方案资源管理器中,右键单击项目并选择“ 发布”。
选择 更多操作>编辑 以打开发布设置。
在 MyDatabaseContext 下拉列表中,选择 Azure SQL 数据库的数据库连接。
选择“ 执行代码优先迁移”(在应用程序启动时运行),然后选择“ 保存”。
现已在 Azure 应用中启用了 Code First 迁移,可发布代码更改信息。
在“发布”页上选择“发布” 。
在已发布的 Web 应用中,尝试再次添加更多 to-do 项,然后选择 “完成”,它们应显示为已完成项显示在主页上。
所有现有待办事项仍将显示。 重新发布 ASP.NET 应用程序时,Azure SQL 数据库中的现有数据不会丢失。 此外,Code First 迁移只会更改数据架构,并使数据保持不变。
可直接通过 Azure 应用将跟踪消息流式传输到 Visual Studio。
打开 Controllers\TodosController.cs,请注意,每个作都以方法 Trace.WriteLine()
开头。 此代码演示如何将跟踪消息添加到 Azure 应用。
在 Visual Studio 发布 页上,向下滚动到 “托管 ”部分。
选择右上角的省略号 ... ,然后选择 “查看流式处理日志”。
现在,日志已流式传输到“输出”窗口。
尚未看到任何跟踪消息,因为首次选择 “查看流式处理日志”时,Azure 应用会将跟踪级别设置为该级别
Error
,仅使用Trace.TraceError()
该方法记录错误事件。
若要更改跟踪级别以输出其他跟踪消息,请在“发布”页面的“托管”部分中,选择右上角的...,然后选择“在 Azure 门户中打开”。
在应用的 Azure 门户页上,在左侧菜单中的“监视”下选择“应用服务日志”。
在“应用程序日志记录”(文件系统)下,在“级别”下选择“详细”,然后选择“保存”。
提示
可试验不同的跟踪级别,以查看每个级别分别显示哪些类型的消息。 例如,“信息”级别包括 、
Trace.TraceInformation()
和Trace.TraceWarning()
创建的所有日志,但不包括Trace.TraceError()
创建的日志。在您的浏览器中,再次打开 Azure to-do 列表应用程序,并在应用中进行导航。 跟踪消息(例如以下示例)现在会流动到 Visual Studio 的 “输出” 窗口。
Application:2025-05-12T23:41:11 PID[17108] Verbose GET /Todos/Index Application:2025-05-12T23:42:04 PID[17108] Verbose GET /Todos/Index Application:2025-05-12T23:42:06 PID[17108] Verbose POST /Todos/Create Application:2025-05-12T23:42:07 PID[17108] Verbose GET /Todos/Index
若要停止日志流式处理服务,请在“输出”窗口中选择“停止监视”图标。
在前面的步骤中,你在资源组中创建了 Azure 资源。 如果将来不再需要这些资源,可以通过删除资源组来删除它们。
- 在 Azure 门户的 Web 应用的“概述”页中,选择“资源组”下的 myResourceGroup 链接。
- 在资源组页上,确保列出的资源是要删除的。
- 选择“删除”,在文本框中键入“myResourceGroup”,然后选择“删除”。
转到下一教程,了解如何使用托管标识来提高 Azure SQL 数据库连接安全性。