使用 IApplicationBuilder 创建中间件管道

ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。
ASP.NET Core 中间件 - 图1
每个委托均可在下一个委托前后执行操作。 应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常。
Use 将多个请求委托链接在一起。 next 参数表示管道中的下一个委托。 可通过不调用 next 参数使管道短路。 通常可在下一个委托前后执行操作,如以下示例所示:

  1. public class Startup
  2. {
  3. public void Configure(IApplicationBuilder app)
  4. {
  5. app.Use(async (context, next) =>
  6. {
  7. // Do work that doesn't write to the Response.
  8. await next.Invoke();
  9. // Do logging or other work that doesn't write to the Response.
  10. });
  11. app.Run(async context =>
  12. {
  13. await context.Response.WriteAsync("Hello from 2nd delegate.");
  14. });
  15. }
  16. }

在前面的示例中,Run 委托将 "Hello from 2nd delegate." 写入响应,然后终止管道。 如果在 Run 委托之后添加了另一个 UseRun 委托,则不会调用该委托。

中间件顺序

下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道。
image.png
上图中的“终结点”中间件为相应的应用类型(MVC 或 Razor Pages)执行筛选器管道。
image.png
Startup.Configure 方法添加中间件组件的顺序定义了针对请求调用这些组件的顺序,以及响应的相反顺序。 此顺序对于安全性、性能和功能至关重要。
下面的 Startup.Configure 方法按照建议的顺序增加与安全相关的中间件组件:

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. app.UseDatabaseErrorPage();
  7. }
  8. else
  9. {
  10. app.UseExceptionHandler("/Error");
  11. app.UseHsts();
  12. }
  13. app.UseHttpsRedirection();
  14. app.UseStaticFiles();
  15. // app.UseCookiePolicy();
  16. app.UseRouting();
  17. // app.UseRequestLocalization();
  18. // app.UseCors();
  19. app.UseAuthentication();
  20. app.UseAuthorization();
  21. // app.UseSession();
  22. // app.UseResponseCaching();
  23. app.UseEndpoints(endpoints =>
  24. {
  25. endpoints.MapRazorPages();
  26. endpoints.MapControllerRoute(
  27. name: "default",
  28. pattern: "{controller=Home}/{action=Index}/{id?}");
  29. });
  30. }

注意:

  • UseCorsUseAuthenticationUseAuthorization 必须按照上述顺序运行。

以下 Startup.Configure 方法将为常见应用方案添加中间件组件:

  1. 异常/错误处理
    • 当应用在开发环境中运行时:
      • 开发人员异常页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。
      • 数据库错误页中间件报告数据库运行时错误。
    • 当应用在生产环境中运行时:
      • 异常处理程序中间件 (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 终结点添加到请求管道的终结点路由中间件(带有 MapRazorPagesUseEndpoints)。