c# .net core中间件,生命周期

 

某些模块和处理程序具有存储在 Web.config 中的配置选项。但是在 ASP.NET Core 中,使用新配置模型取代了 Web.config。

HTTP 模块和处理程序如何工作

官网地址:

将 HTTP 处理程序和模块迁移到 ASP.NET Core 中间件 | Microsoft Learn

处理程序是:

  • 实现 IHttpHandler 的类

  • 用于处理具有给定文件名或扩展名(如 .report)的请求

  • 在 Web.config 中进行配置

模块是:

  • 实现 IHttpModule 的类

  • 对每个请求进行调用

  • 能够短路(停止请求的进一步处理)

  • 能够添加到 HTTP 响应,或创建自己的响应

  • 在 Web.config 中进行配置

模块处理传入请求的顺序取决于:

  1. 由 ASP.NET 触发的序列事件,如 BeginRequest 和 AuthenticateRequest。 有关完整列表,请参见System.Web.HttpApplication。 每个模块都可以为一个或多个事件创建处理程序。

  2. 它们在 Web.config 中进行配置的顺序(对于同一事件)。

除了模块之外,还可以将生命周期事件的处理程序添加到 Global.asax.cs 文件。 这些处理程序在所配置的模块中的处理程序之后运行。

从处理程序和模块到中间件

中间件比 HTTP 模块和处理程序更简单:

  • 模块、处理程序、Global.asax.csWeb.config(IIS 配置除外)和应用程序生命周期已不存在

  • 模块和处理程序的角色由中间件接管

  • 中间件使用代码而不是在 Web.config 中进行配置

  • 管道分支使你可以不仅基于 URL,而且基于请求标头、查询字符串等向特定中间件发送请求。

中间件与模块非常相似:

中间件和模块采用不同顺序进行处理:

在上图中,请注意身份验证中间件如何使请求短路。


中间件顺序

官方地址:ASP.NET Core 中间件 | Microsoft Learn

下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道。 你可以在典型应用中了解现有中间件的顺序,以及在哪里添加自定义中间件。 你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。

 

使用 WebApplication 创建中间件管道

ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。

每个委托均可在下一个委托前后执行操作。 应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常。

尽可能简单的 ASP.NET Core 应用设置了处理所有请求的单个请求委托。 这种情况不包括实际请求管道。 调用单个匿名函数以响应每个 HTTP 请求。

 

向 Program.cs 文件中添加中间件组件的顺序定义了针对请求调用这些组件的顺序,以及响应的相反顺序。 此顺序对于安全性、性能和功能至关重要。

以下 Program.cs 代码将为常见应用场景添加中间件组件:

  1. 异常/错误处理
    • 当应用在开发环境中运行时:
    • 当应用在生产环境中运行时:
      • 异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。
      • HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security 标头。
  2. HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。
  3. 静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。
  4. Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。
  5. 用于路由请求的路由中间件 (UseRouting)。
  6. 身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。
  7. 用于授权用户访问安全资源的授权中间件 (UseAuthorization)。
  8. 会话中间件 (UseSession) 建立和维护会话状态。 如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。
  9. 用于将 Razor Pages 终结点添加到请求管道的终结点路由中间件(带有 MapRazorPages 的 UseEndpoints)。
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMiddleware.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
    ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();

app.UseRouting();
// app.UseRateLimiter();
// app.UseRequestLocalization();
// app.UseCors();

app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

内置中间件

ASP.NET Core 附带以下中间件组件。 “顺序”列提供备注,以说明中间件在请求处理管道中的放置,以及中间件可能会终止请求处理的条件。 如果中间件让请求处理管道短路,并阻止下游中间件进一步处理请求,它被称为“终端中间件”。 若要详细了解短路,请参阅使用 WebApplication 创建中间件管道部分。

展开表

中间件 描述 顺序
身份验证 提供身份验证支持。 在需要 HttpContext.User 之前。 OAuth 回叫的终端。
授权 提供身份验证支持。 紧接在身份验证中间件之后。
Cookie 策略 跟踪用户是否同意存储个人信息,并强制实施 cookie 字段(如 secure 和 SameSite)的最低标准。 在发出 cookie 的中间件之前。 示例:身份验证、会话、MVC (TempData)。
CORS 配置跨域资源共享。 在使用 CORS 的组件之前。 由于此错误UseCors 当前必须在 UseResponseCaching 之前运行。
DeveloperExceptionPage 生成一个页面,其中包含的错误信息仅适用于开发环境。 在生成错误的组件之前。 对于开发环境,项目模板会自动将此中间件注册为管道中的第一个中间件。
诊断 提供新应用的开发人员异常页、异常处理、状态代码页和默认网页的几个单独的中间件。 在生成错误的组件之前。 异常终端或为新应用提供默认网页的终端。
转接头 将代理标头转发到当前请求。 在使用已更新字段的组件之前。 示例:方案、主机、客户端 IP、方法。
运行状况检查 检查 ASP.NET Core 应用及其依赖项的运行状况,如检查数据库可用性。 如果请求与运行状况检查终结点匹配,则为终端。
标头传播 将 HTTP 标头从传入的请求传播到传出的 HTTP 客户端请求中。
HTTP 日志记录 记录 HTTP 请求和响应。 中间件管道的开头。
HTTP 方法重写 允许传入 POST 请求重写方法。 在使用已更新方法的组件之前。
HTTPS 重定向 将所有 HTTP 请求重定向到 HTTPS。 在使用 URL 的组件之前。
HTTP 严格传输安全性 (HSTS) 添加特殊响应标头的安全增强中间件。 在发送响应之前,修改请求的组件之后。 示例:转接头、URL 重写。
MVC 用 MVC/Razor Pages 处理请求。 如果请求与路由匹配,则为终端。
OWIN 与基于 OWIN 的应用、服务器和中间件进行互操作。 如果 OWIN 中间件处理完请求,则为终端。
输出缓存 基于配置提供对缓存响应的支持。 在需要缓存的组件之前。 UseRouting 必须在 UseOutputCaching 之前。 UseCORS 必须在 UseOutputCaching 之前。
响应缓存 提供对缓存响应的支持。 这需要客户端参与才能正常工作。 使用输出缓存实现完整的服务器控制。 在需要缓存的组件之前。 UseCORS 必须在 UseResponseCaching 之前。 通过对 Razor Pages 等 UI 应用没有好处,因为浏览器通常会设置阻止缓存的请求头。 输出缓存有利于 UI 应用。
请求解压缩 提供对解压缩请求的支持。 在读取请求正文的组件之前。
响应压缩 提供对压缩响应的支持。 在需要压缩的组件之前。
请求本地化 提供本地化支持。 在对本地化敏感的组件之前。 使用 RouteDataRequestCultureProvider 时,必须在路由中间件之后显示。
终结点路由 定义和约束请求路由。 用于匹配路由的终端。
SPA 通过返回单页应用程序 (SPA) 的默认页面,在中间件链中处理来自这个点的所有请求 在链中处于靠后位置,因此其他服务于静态文件、MVC 操作等内容的中间件占据优先位置。
会话 提供对管理用户会话的支持。 在需要会话的组件之前。
静态文件 为提供静态文件和目录浏览提供支持。 如果请求与文件匹配,则为终端。
URL 重写 提供对重写 URL 和重定向请求的支持。 在使用 URL 的组件之前。
W3CLogging 以 W3C 扩展日志文件格式生成服务器访问日志。 中间件管道的开头。
WebSockets 启用 WebSockets 协议。 在接受 WebSocket 请求所需的组件之前。

延伸阅读

c# .net mvc的IHttpHandler奇妙之旅。.net的生命周期和管道你听说过吗?你可以利用他处理业务如:跳转业务页面,文件请求的安全过滤,等等,还有许多神秘业务等着你去发现-CSDN博客

 

相关推荐

  1. React 组生命周期

    2024-07-19 05:42:03       37 阅读
  2. Vue组生命周期

    2024-07-19 05:42:03       54 阅读
  3. Vue 3.x组生命周期

    2024-07-19 05:42:03       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 05:42:03       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 05:42:03       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 05:42:03       62 阅读
  4. Python语言-面向对象

    2024-07-19 05:42:03       72 阅读

热门阅读

  1. Perl 语言的特点

    2024-07-19 05:42:03       23 阅读
  2. Spark SQL----CREATE TABLE

    2024-07-19 05:42:03       16 阅读
  3. IntelliJ IDEA 和 Eclipse的区别

    2024-07-19 05:42:03       24 阅读
  4. 【Android】基础—基本布局

    2024-07-19 05:42:03       15 阅读
  5. Docker & Ubuntu & Milvus 2.4 windows 详细安装攻略

    2024-07-19 05:42:03       16 阅读
  6. c# excel转pdf

    2024-07-19 05:42:03       20 阅读
  7. (二)C++之类与对象

    2024-07-19 05:42:03       21 阅读
  8. C++派生类对基类成员的访问

    2024-07-19 05:42:03       21 阅读
  9. junit mockito service

    2024-07-19 05:42:03       22 阅读
  10. MySQL为什么使用B+树而不是跳表?

    2024-07-19 05:42:03       20 阅读
  11. 前端代码审查大纲

    2024-07-19 05:42:03       20 阅读