小窍门
为 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 文档中的捆绑和缩小静态资产 中找到。