ASP.NET Core - 中间件


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

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

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

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

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

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

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

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

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

中间件
  • 中间件是该处理管道中存在的一系列组件。

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

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

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

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

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

  • 路由器会在应用程序中查找要响应的内容,如果路由器没有找到要响应的内容,则路由器本身可能会返回404 Not Found 错误

例子

现在让我们通过一个简单的例子来更多地了解中间件。我们使用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接口上的扩展方法来添加中间件。

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

  • IIS平台处理程序
  • 使用 app.Run 注册的中间件

IIS平台处理程序

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

使用 app.Run 注册的中间件

在本例中,下一个中间件是通过app.Run注册的中间件。Run 方法允许我们传入另一个方法,我们可以用它来处理每个响应。Run 并不是您经常看到的东西,它是我们所说的终端中间件。

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

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

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

如何添加另一个中间件

让我们继续执行以下步骤来添加另一个中间件 -

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

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

微软 AspNet 诊断

步骤 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 - 运行您的应用程序,您将看到以下欢迎屏幕。

欢迎屏幕

此欢迎屏幕可能没有那么有用。

步骤 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页面并刷新浏览器,您将看到以下页面。

启动CS

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

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

运行时信息

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