教程:使用 Azure SQL 数据库将 ASP.NET 应用部署到 Azure

Azure 应用服务提供高度可缩放、自修复的 Web 托管服务。 本教程演示如何在应用服务中部署数据驱动的 ASP.NET 应用,以及如何将其连接到 Azure SQL 数据库。 完成后,你便拥有了一个在 Azure 中运行并连接到 SQL 数据库的 ASP.NET 应用。

Published ASP.NET application in Azure App Service

本教程介绍如何执行下列操作:

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

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

完成本教程:

安装 Visual Studio 2022,其中包含 ASP.NET 和 Web 开发以及 Azure 开发工作负载。

如果已安装 Visual Studio,请单击“工具”>Get Tools and Features“获取工具和功能”,以便在 Visual Studio 中添加工作负荷。

下载示例

  1. 下载示例项目

  2. 提取(解压缩)dotnet-sqldb-tutorial-master.zip 文件。

此示例项目包含一个使用 Entity Framework Code First 的基本 ASP.NET MVC 创建-读取-更新-删除 (CRUD) 应用。

运行应用

  1. 在 Visual Studio 中打开 dotnet-sqldb-tutorial-master/DotNetAppSqlDb.sln 文件。

  2. 键入 F5,以便运行该应用。 该应用将显示在默认浏览器中。

    注意

    如果仅安装了 Visual Studio 和先决条件,可能必须通过 NuGet 安装缺失的包

  3. 选择“新建”链接,创建多个待办事项。

    New ASP.NET Project dialog box

  4. 测试“编辑”、“详细信息”和“删除”链接。

该应用使用数据库上下文与数据库进行连接。 在此示例中,数据库上下文使用名为 MyDbConnection 的连接字符串。 此连接字符串在 Web.config 文件中设置,在 Models/MyDatabaseContext.cs 文件中引用。 在教程后面部分,该连接字符串名称用于将 Azure 应用连接到 Azure SQL 数据库。

将 ASP.NET 应用程序发布到 Azure

  1. 在“解决方案资源管理器”中,右键单击 “DotNetAppSqlDb”项目,然后选择“发布”。

    Publish from Solution Explorer

  2. 选择 Azure 作为目标,然后单击下一步

  3. 确保已选择 Azure 应用服务 (Windows) ,然后单击下一步

登录并添加应用

  1. 在“发布”对话框中,单击“登录”。

  2. 登录到 Azure 订阅。 如果已登录到 Azure 帐户,请确保该帐户包含 Azure 订阅。 如果登录的 Azure 帐户不包含 Azure 订阅,请单击该帐户添加正确的帐户。

  3. 在“应用服务实例”窗格中,单击“+”。

    Sign in to Azure

配置 Web 应用名称

可保留生成的 Web 应用名称,或将其更改为另一个唯一名称(有效字符是 a-z0-9-)。 Web 应用名称将用作应用默认 URL 的一部分(<app_name>.chinacloudsites.cn,其中 <app_name> 是 Web 应用的名称)。 在 Azure 的所有应用中,Web 应用名称必须是唯一的。

注意

暂时不要选择创建

Create app service dialog

创建资源组

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

  1. 在“资源组”旁边单击“新建”。

    Next to Resource Group, click New.

  2. 将资源组命名为 myResourceGroup

创建应用服务计划

应用服务计划指定托管应用的 Web 服务器场的位置、大小和功能。 可以在托管多个应用时节省资金,方法是将多个 Web 应用配置为共用一个应用服务计划。

应用服务计划定义:

  • 区域(例如:中国东部、中国东部 2、中国北部、中国北部 2、中国北部 3)
  • 实例大小(小、中、大)
  • 规模计数(1 到 20 个实例)
  • SKU(免费、共享、基本、标准、高级)
  1. 托管计划旁边,单击新建

  2. 配置应用服务计划对话框中,使用以下设置配置新的应用服务计划并单击确定

    设置 建议的值 更多信息
    应用服务计划 myAppServicePlan 应用服务计划
    位置 中国北部 Azure 区域
    大小 免费 定价层

    Create App Service plan

  3. 单击创建并等待创建 Azure 资源。

  4. “发布”对话框显示已配置的资源。 单击“完成” 。

    the resources you've created

创建服务器和数据库

在创建数据库时之前,需要逻辑 SQL Server。 逻辑 SQL 服务器是一种逻辑构造,其中包含一组作为组管理的数据库。

  1. 发布对话框中,向下滚动到服务依赖项部分。 单击 SQL Server 数据库旁边的配置

    注意

    请确保从“发布”页面而不是“连接的服务”页面配置 SQL 数据库。

    Configure SQL Database dependency

  2. 选择 Azure SQL 数据库,然后单击下一步

  3. 在“配置 Azure SQL 数据库”对话框中,单击“+”。

  4. 数据库服务器旁,单击新建

    服务器名称用作服务器 <server_name>.database.chinacloudapi.cn 的默认 URL 的一部分。 它在 Azure SQL 的所有服务器中必须是唯一的。 将服务器名称更改为所需的值。

  5. 添加管理员用户名和密码。 有关密码复杂性要求,请参阅密码策略

    请记住此用户名和密码。 以后需要使用此用户名和密码来管理服务器。

    Create server

    重要

    虽然连接字符串中的密码已在 Visual Studio 和应用服务中受到屏蔽,但由于它实际上是保留在某个位置,因此增加了应用的受攻击面。 应用服务可以使用托管服务标识,因此根本不需要将机密保留在代码或应用配置中,这样就消除了上述风险。 有关详细信息,请参阅后续步骤

  6. 单击“确定”。

  7. Azure SQL 数据库对话框中,保留默认生成的数据库名称。 选择创建并等待创建数据库资源。

    Configure database

配置数据库连接

  1. 向导完成创建数据库资源后,单击下一步

  2. 数据库连接字符串名称中,键入 MyDbConnection。 此名称必须与 Models/MyDatabaseContext.cs 中引用的连接字符串相匹配。

  3. 数据库连接用户名数据库连接密码中,键入在创建服务器时使用的管理员用户名和密码。

  4. 确保已选择 Azure 应用设置,然后单击完成

    注意

    相反,如果看到的是“本地用户机密文件”,则必定已从“连接的服务”页而非“发布”页配置 SQL 数据库。

    Configure database connection string

  5. 等待配置向导完成,并单击关闭

部署 ASP.NET 应用

  1. 在“发布”选项卡中,向上滚动到顶部,然后单击“发布”。 将 ASP.NET 应用部署到 Azure 后。 默认浏览器会使用已部署应用的 URL 启动。

  2. 添加多个待办事项。

    Published ASP.NET application in Azure app

    祝贺你! 数据驱动 ASP.NET 应用程序当前在 Azure 应用服务中实时运行。

本地访问数据库

使用 Visual Studio 可在 SQL Server 对象资源管理器中轻松浏览和管理自己在 Azure 的新数据库。 新数据库已向创建的应用服务应用打开了防火墙。 但是,若要从本地计算机(例如从 Visual Studio)访问它,必须为本地计算机的公共 IP 地址打开防火墙。 如果您的 internet 服务提供商更改了您的公共 IP 地址,则需要重新配置防火墙以再次访问 Azure 数据库。

创建数据库连接

  1. 在“视图”菜单中,选择“SQL Server 对象资源管理器”。

  2. 在“SQL Server 对象资源管理器”顶部,单击“添加 SQL Server”按钮。

配置数据库连接

  1. 在“连接”对话框中,展开“Azure”节点。 此处列出了 Azure 中的所有 SQL 数据库实例。

  2. 选择先前创建的数据库。 底部将自动填充前面创建的连接。

  3. 键入先前创建的数据库管理员密码,然后单击“连接”。

    Configure database connection from Visual Studio

允许来自你的计算机的客户端连接

此时会打开“新建防火墙规则”对话框。 默认情况下,服务器仅允许从 Azure 服务(例如 Azure 应用)连接到其数据库。 若要从 Azure 外部连接到数据库,请在服务器级别创建防火墙规则。 防火墙规则允许本地计算机的公共 IP 地址。

对话框中已填充了你的计算机的公共 IP 地址。

  1. 请确保选中“添加我的客户端 IP”,然后单击“确定”。

    Create firewall rule

    Visual Studio 成功为 SQL 数据库实例创建防火墙设置后,连接将立即显示在“SQL Server 对象资源管理器”中。

    可在此处执行最常见的数据库操作,如运行查询、创建视图和存储过程等。

  2. 展开连接 >“数据库”><你的数据库>>“表”。 右键单击 Todoes 表,然后选择“查看数据”。

    Explore SQL Database objects

使用 Code First 迁移更新应用

可以在 Visual Studio 中使用熟悉的工具,更新 Azure 中的数据库和应用。 此步骤中将使用实体框架中的 Code First 迁移对数据库架构进行更改,并将其发布至 Azure。

有关使用 Entity Framework Code First 迁移的详细信息,请参阅使用 MVC 5 的 Entity Framework 6 Code First 入门

更新数据模型

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

public bool Done { get; set; }

本地运行 Code First 迁移

运行几个命令来更新本地数据库。

  1. 在“工具”菜单中,单击“NuGet 包管理器”>“包管理器控制台”。

  2. 在“程序包管理器控制台”窗口中,启用“Code First 迁移”:

    Enable-Migrations
    
  3. 添加迁移:

    Add-Migration AddProperty
    
  4. 更新本地数据库:

    Update-Database
    
  5. 键入 Ctrl+F5,以便运行该应用。 测试“编辑”、“详细信息”和“创建”链接。

如果应用程序加载未出错,则 Code First 迁移成功。 但页面看上去仍没有变化,这是因为应用程序逻辑尚未使用新属性。

使用新属性

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

  1. 打开 Controllers\TodosController.cs

  2. 在第 52 行找到 Create() 方法,并将 Done 添加到 Bind 特性中的属性列表。 完成后,Create() 方法签名应如下面的代码所示:

    public ActionResult Create([Bind(Include = "Description,CreatedDate,Done")] Todo todo)
    
  3. 打开 Views\Todos\Create.cshtml

  4. 在 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>
    
  5. 打开 Views\Todos\Index.cshtml

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

    <th>
        @Html.DisplayNameFor(model => model.Done)
    </th>
    
  7. 查找包含 Html.ActionLink() 帮助器方法的 <td> 元素。 在此 <td>上面,使用以下 Razor 代码添加另一个 <td> 元素:

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

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

  8. 键入 Ctrl+F5,以便运行该应用。

你现在可以添加一个待办事项,并检查''Done''。 然后,它应作为已完成项在主页中显示。 请记住,Edit视图不显示Done字段,因为没有更改Edit视图。

在 Azure 中启用 Code First 迁移

代码更改生效(包括数据库迁移)后,将其发布至 Azure 应用,并使用 Code First 迁移更新 SQL 数据库。

  1. 与先前的操作相同,右键单击项目,然后选择“发布”。

  2. 单击更多操作>编辑以打开发布设置。

    Open publish settings

  3. MyDatabaseContext 下拉列表中,为 Azure SQL 数据库选择数据库连接。

  4. 选择“执行 Code First 迁移(应用程序启动时运行)”,然后单击“保存”。

    Enable Code First Migrations in Azure app

发布更改

现已在 Azure 应用中启用了 Code First 迁移,可发布代码更改信息。

  1. 在发布页中单击“发布”。

  2. 再次尝试添加待办事项并选择“完成”,然后,它们将作为已完成项显示在主页中。

    Azure app after Code First Migration

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

流式传输应用程序日志

可直接通过 Azure 应用将跟踪消息流式传输到 Visual Studio。

打开 Controllers\TodosController.cs

每个操作都以 Trace.WriteLine() 方法开头。 添加此代码的目的是演示如何将跟踪消息添加至 Azure 应用。

启用日志流式传输

  1. 在发布页中,向下滚动到“托管”部分。

  2. 在右上角,单击“...”>“查看流式传输日志”。

    Enable log streaming

    现在,日志已流式传输到“输出”窗口。

    Log streaming in Output window

    但还无法查看任何跟踪消息。 因为当首先选择“查看流式处理日志”时,Azure 应用将跟踪级别设置为 Error,此级别只记录错误事件(使用 Trace.TraceError() 方法)。

更改跟踪级别

  1. 若要更改跟踪级别以输出其他跟踪消息,请返回发布页。

  2. 在“托管”部分中,单击“...”>“在 Azure 门户中打开”。

  3. 在应用的“门户管理”页上,从左侧菜单中选择应用服务日志

  4. 应用程序日志记录(文件系统) 下,选择详细级别。 单击“ 保存”。

    提示

    可试验不同的跟踪级别,以查看每个级别分别显示哪些类型的消息。 例如,“信息”级别包括 Trace.TraceInformation()Trace.TraceWarning()Trace.TraceError() 创建的所有日志,但不包括 Trace.WriteLine() 创建的日志。

  5. 在浏览器中再次导航到应用(http://<your app name>.chinacloudsites.cn),然后尝试在 Azure 中的待办事项列表应用程序周围单击。 现在,跟踪消息已流式传输到 Visual Studio 中的“输出”窗口。

    Application: 2017-04-06T23:30:41  PID[8132] Verbose     GET /Todos/Index
    Application: 2017-04-06T23:30:43  PID[8132] Verbose     GET /Todos/Create
    Application: 2017-04-06T23:30:53  PID[8132] Verbose     POST /Todos/Create
    Application: 2017-04-06T23:30:54  PID[8132] Verbose     GET /Todos/Index
    

停止日志流式传输

若要停止日志流式传输服务,请单击“输出”窗口中的“停止监视”按钮。

Stop log streaming

清理资源

在前面的步骤中,你在资源组中创建了 Azure 资源。 如果将来不再需要这些资源,可以通过删除资源组来删除它们。

  1. 在 Azure 门户的 Web 应用的“概述”页中,选择“资源组”下的 myResourceGroup 链接。
  2. 在资源组页上,确保列出的资源是要删除的。
  3. 选择“删除”,在文本框中键入“myResourceGroup”,然后选择“删除” 。

后续步骤

在本教程中,你了解了如何执行以下操作:

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

转到下一教程,了解如何轻松地提高 Azure SQL 数据库连接的安全性。

更多资源:

希望优化并节省云支出?