应用启动

小窍门

此内容摘自 eBook《适用于 Azure 的 ASP.NET Web Forms 开发人员的 Blazor》,可在 .NET Docs 上查看或下载免费的可脱机阅读的 PDF 文件。

Blazor-for-ASP-NET-Web-Forms-Developers 电子书封面缩略图。

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

Application_Start 和 Web Forms

多年来,默认的 Web 窗体 Application_Start 方法在用途上已发展,用于处理许多配置任务。 Visual Studio 2022 中具有默认模板的新 Web 窗体项目现在包含以下配置逻辑:

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

每个单独的文件都驻留在 App_Start 文件夹中,仅在应用程序开始时运行一次。 RouteConfig 在默认项目模板中添加 FriendlyUrlSettings Web 窗体,以允许应用程序 URL 省略 .ASPX 文件扩展名。 默认模板还包含一个指令,它为 .ASPX 页面提供永久 HTTP 重定向状态代码(HTTP 301),将其重定向到省略扩展名的友好 URL 文件名。

借助 ASP.NET Core 和 Blazor,这些方法要么简化并合并到类中 Startup ,要么被消除,而有利于常见的 Web 技术。

Blazor 服务器启动结构

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 核心框架服务的方式。 各种 builder.Services.Add* 方法添加了支持身份验证、razor 页面、MVC 控制器路由、SignalR 和 Blazor 服务器交互等功能的服务。 Web 窗体中不需要此方法,因为 ASPX、ASCX、ASHX 和 ASMX 文件的分析和处理是通过引用 web.config 配置文件中的 ASP.NET 定义的。 有关 ASP.NET Core 中依赖注入的详细信息,请参阅联机 文档

app 生成 builder 后,对 app 的其余调用配置其 HTTP 管道。 通过这些调用,我们从上到下声明中间件,该 中间件 将处理发送到应用程序的每个请求。 默认配置中的大多数功能分散在 Web 窗体配置文件中,现在位于一个位置,方便参考。

自定义错误页的配置不再放置在 web.config 文件中,而是现在设置为在应用程序环境未标记为 Development 时始终显示。 此外,ASP.NET Core 应用程序现在通过默认调用 UseHttpsRedirection 方法来配置使用 TLS 提供安全页面。

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

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

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

最后一行启动了应用程序,这一点在 Web 窗体中是不需要的(因为它依赖于 IIS 正在运行)。

升级 BundleConfig 进程

捆绑 CSS 样式表和 JavaScript 文件等资产的技术发生了显著变化,其他技术提供了快速演变的工具和技术来管理这些资源。 为此,我们建议使用 Node 命令行工具(如 Grunt/Gulp/WebPack)打包静态资产。

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

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

有关管理 CSS 和 JavaScript 文件的两种策略的更多详细信息,可在 ASP.NET Core 文档中的捆绑和缩小静态资产 中找到。