ASP.NET Core - 中间件



本章将讲解如何设置中间件。ASP.NET Core 中的中间件控制应用程序如何响应 HTTP 请求。它还可以控制应用程序在发生错误时的外观,并且是验证和授权用户执行特定操作的关键部分。

  • 中间件是组装到应用程序管道中的软件组件,用于处理请求和响应。

  • 每个组件都会选择是否将请求传递给管道中的下一个组件,并且可以在调用管道中的下一个组件之前和之后执行某些操作。

  • 请求委托用于构建请求管道。请求委托处理每个 HTTP 请求。

  • ASP.NET Core 中的每个中间件都是一个对象,每个中间件都具有非常具体、集中和有限的作用。

  • 最终,我们需要许多中间件才能使应用程序正常运行。

现在让我们假设我们想要将有关每个请求的信息记录到我们的应用程序中。

  • 在这种情况下,我们可能安装到应用程序中的第一个中间件是日志记录组件。

  • 此日志记录器可以看到有关传入请求的所有信息,但日志记录器很可能只会记录一些信息,然后将此请求传递给下一个中间件。

Middleware
  • 中间件是此处理管道中的一系列组件。

  • 我们安装到应用程序中的下一个中间件是授权器。

  • 授权器可能会在 HTTP 标头中查找特定的 Cookie 或访问令牌。

  • 如果授权器找到令牌,则允许请求继续。如果没有,授权器本身可能会使用 HTTP 错误代码或重定向代码来响应请求,将用户发送到登录页面。

  • 否则,授权器将请求传递给下一个中间件,即路由器。

  • 路由器查看 URL 并确定您的下一步操作。

  • 路由器查看应用程序是否有要响应的内容,如果路由器找不到要响应的内容,路由器本身可能会返回一个404 未找到错误

示例

现在让我们来看一个简单的例子来进一步了解中间件。我们使用Startup 类的 Configure 方法在 ASP.NET 中设置中间件。

using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Hosting; 
using Microsoft.AspNet.Http; 

using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Configuration;  

namespace FirstAppDemo { 
   public class Startup { 
      public Startup() { 
         var builder = new ConfigurationBuilder() 
            .AddJsonFile("AppSettings.json"); 
         Configuration = builder.Build(); 
      }  
      public IConfiguration Configuration { get; set; }  
       
      // This method gets called by the runtime. 
      // Use this method to add services to the container. 
      // For more information on how to configure your application, 
      // visit http://go.microsoft.com/fwlink/?LinkID=398940 
      public void ConfigureServices(IServiceCollection services) { 
      }  
      
      // This method gets called by the runtime.  
      // Use this method to configure the HTTP request pipeline. 
      public void Configure(IApplicationBuilder app) { 
         app.UseIISPlatformHandler();  
         
         app.Run(async (context) => { 
            var msg = Configuration["message"]; 
            await context.Response.WriteAsync(msg); 
         });  
      }  
      // Entry point for the application. 
      public static void Main(string[] args) => WebApplication.Run<Startup>(args); 
   } 
} 

Configure()方法中,我们将对 IApplicationBuilder 接口调用扩展方法来添加中间件。

默认情况下,新的空项目中有两个中间件:

  • IISPlatformHandler
  • 使用 app.Run 注册的中间件

IISPlatformHandler

IISPlatformHandler允许我们使用 Windows 身份验证。它将查看每个传入请求,并查看是否有任何与该请求关联的 Windows 身份信息,然后调用下一个中间件。

使用 app.Run 注册的中间件

在这种情况下,下一个中间件是用app.Run注册的中间件。Run 方法允许我们传入另一个方法,我们可以使用它来处理每个响应。Run 不是经常看到的东西,我们称之为终端中间件。

使用 Run 注册的中间件将永远没有机会调用另一个中间件,它所做的只是接收请求,然后必须生成某种响应。

您还可以访问 Response 对象,您可以使用 Response 对象执行的操作之一是写入字符串。

如果您想在 app.Run 之后注册另一个中间件,则永远不会调用该中间件,因为 Run 是终端中间件。它永远不会调用下一个中间件。

如何添加另一个中间件

让我们按照以下步骤添加另一个中间件:

步骤 1 - 要添加另一个中间件,请右键单击项目并选择“管理 NuGet 包”。

步骤 2 - 搜索Microsoft.aspnet.diagnostics,它实际上是用于异常处理、异常显示页面和诊断信息的 ASP.NET Core 中间件。此特定包包含我们可以使用的许多不同的中间件。

Microsoft AspNet Diagnostics

步骤 3 - 如果项目中未安装该包,请安装它。

步骤 4 - 现在让我们转到Configure()方法并调用app.UseWelcomePage中间件。

// This method gets called by the runtime.  
// Use this method to configure the HTTP request pipeline. 
public void Configure(IApplicationBuilder app) { 
   app.UseIISPlatformHandler(); 
   app.UseWelcomePage();  
   
   app.Run(async (context) => { 
      var msg = Configuration["message"]; 
      await context.Response.WriteAsync(msg); 
   });  
}

步骤 5 - 运行您的应用程序,您将看到以下欢迎屏幕。

Welcome Screen

此欢迎屏幕可能不太有用。

步骤 6 - 让我们尝试一些可能更有用的东西。我们将使用RuntimeInfoPage,而不是使用欢迎页面。

// This method gets called by the runtime.  
// Use this method to configure the HTTP request pipeline. 
public void Configure(IApplicationBuilder app) { 
   app.UseIISPlatformHandler(); 
   app.UseRuntimeInfoPage();  
   
   app.Run(async (context) => { 
      var msg = Configuration["message"]; 
      await context.Response.WriteAsync(msg); 
   });  
}

步骤 7 - 保存您的Startup.cs页面并刷新浏览器,您将看到以下页面。

Startup CS

RuntimeInfoPage是一个中间件,它只响应针对特定 URL 的请求。如果传入请求与该 URL 不匹配,则此中间件只会让请求传递到下一个中间件。请求将通过 IISPlatformHandler 中间件,然后转到 UseRuntimeInfoPage 中间件。它不会创建响应,因此它将转到我们的 app.Run 并显示字符串。

步骤 8 - 让我们在 URL 的末尾添加“/runtimeinfo”。您现在将看到由该运行时信息页面中间件生成的页面。

Runtime Information

您现在将看到一个响应,其中提供了有关运行时环境的一些信息,例如操作系统、运行时版本、体系结构、类型以及您正在使用的所有包等。

广告