应用启动

提示

此内容摘自电子书《面向 Azure ASP.NET Web Forms 开发人员的 Blazor》,可在 .NET 文档上获取,也可作为免费可下载的 PDF 脱机阅读。

Blazor-for-ASP-NET-Web-Forms-Developers eBook cover thumbnail.

为 ASP.NET 编写的应用程序通常包含一个 global.asax.cs 文件,该文件定义 Application_Start 事件来确定针对 HTML 呈现和 .NET 处理应配置和提供哪些服务。 本章介绍 ASP.NET Core 和 Blazor Server 之间的不同之处。

Application_Start 和 Web Forms

默认的 Web Forms Application_Start 方法经过多年的验证和改进,可用于处理许多配置任务。 Visual Studio 2022 中带有默认模板的全新 Web Forms 项目现在包含以下配置逻辑:

  • RouteConfig - 应用程序 URL 路由
  • BundleConfig - CSS 与 JavaScript 的捆绑和缩小

所有文件都驻留在 App_Start 文件夹中,并且仅在应用程序启动时运行一次。 默认项目模板中的 RouteConfig 为 Web Forms 添加了 FriendlyUrlSettings,允许应用程序 URL 省略 .ASPX 文件扩展名。 默认模板还包含一个指令,该指令为易记 URL(其名称省略扩展名)提供 .ASPX 页面的永久 HTTP 重定向状态代码 (HTTP 301)。

通过 ASP.NET Core 和 Blazor,这些方法可以简化并合并到 Startup 类中,或被通用 Web 技术替代。

Blazor Server 启动结构

Blazor Server 应用程序在 ASP.NET Core 3.0 或更高版本中受支持。 ASP.NET Core Web 应用程序在 Program.cs 中进行配置,或者通过 Startup.cs 类中的一对方法进行配置。 下面显示了 Program.cs 文件示例:

using BlazorApp1.Data;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

将应用所需的服务添加到 WebApplicationBuilder 实例的 Services 集合中。 这就是使用框架的内置依赖关系注入容器配置各种 ASP.NET Core 框架服务的方式。 各种 builder.Services.Add* 方法添加了一些服务,这些服务支持身份验证、Razor Pages、MVC 控制器路由、SignalR 以及 Blazor Server 与其他许多服务器的交互等功能。 Web Forms 无需此方法,因为对 ASPX、ASCX、ASHX 和 ASMX 文件的分析和处理是通过引用 web.config 配置文件中的 ASP.NET 来定义的。 有关 ASP.NET Core 中的依赖注入的详细信息,请参阅在线文档

builder 生成 app 后,对 app 的其余调用配置其 HTTP 管道。 通过这些调用,我们对中间件进行了从上而下的声明,该中间件将处理发送到应用程序的所有请求。 默认配置中的大多数功能之前都是分散在各个 Web Forms 配置文件中的,为便于参阅,现在它们都在位于同一位置。

自定义错误页的配置不再位于 web.config 文件中,而是配置为在应用程序环境未标记 Development 的情况下始终显示。 ASP.NET Core 应用程序现已配置为默认使用 UseHttpsRedirection 方法调用为安全页面提供 TLS。

接下来,对 UseStaticFiles 进行意外配置方法调用。 在 ASP.NET Core 中,必须显式启用对静态文件的请求的支持,并且默认情况下,只有应用的 wwwroot 文件夹中的文件才是公开可寻址的。

下一行是复制 Web Forms UseRouting 的配置选项之一的第一行。 此方法将 ASP.NET Core 路由器添加到管道,该路由器可在此处或在其考虑路由到的单个文件中进行配置。 有关路由配置的详细信息,请参阅路由部分

本节最后的 app.Map* 调用定义 ASP.NET Core 侦听的终结点。 这些路由是可以在 Web 服务器上访问的 Web 可访问位置,并且可以接收由 .NET 处理并返回给你的某些内容。 第一个项 MapBlazorHub 配置 SignalR 集线器,使其可用于为服务器提供实时且持久的连接,以便在其中处理 Blazor 组件的状态和呈现。 MapFallbackToPage 方法调用指示启动 Blazor 应用程序的页面的 Web 可访问的位置,还将应用程序配置为处理来自客户端的深层链接请求。 打开浏览器并直接导航到应用程序中 Blazor 处理的路由时(例如默认模板中的 /counter),你将看到正是这一功能在起作用。 请求由 _Host.cshtml 回退页面处理,该页面随后会运行 Blazor 路由器并呈现路由器页面。

最后一行启动了应用程序,这在 Web 表单中是不需要的(因为它依赖 IIS 来运行)。

升级 BundleConfig 进程

捆绑 CSS 样式表和 JavaScript 文件等资产的技术发生了显著变化,同时其他技术也在提供不断改进的工具和技术来管理这些资源。 为此,建议使用 Grunt、Gulp 或 WebPack 等 Node 命令行工具打包静态资产。

可以将 Grunt、Gulp 和 WebPack 命令行工具以及相关配置添加到你的应用程序,ASP.NET Core 将在应用程序生成过程中忽略这些文件。 可通过在项目文件中添加 Target 来添加运行其任务的调用。该项目文件的语法与以下语法类似,会触发 gulp 脚本以及该脚本中的 min 目标:

<Target Name="MyPreCompileTarget" BeforeTargets="Build">
  <Exec Command="gulp min" />
</Target>

有关管理 CSS 和 JavaScript 文件的两种策略的详细信息,请参阅捆绑和缩小 ASP.NET Core 中的静态资产文档。