ASP.NET Core - 中间件

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

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

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

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

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

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

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

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

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

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

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

  • 授权方可能正在 HTTP 标头中寻找特定的 cookie 或访问令牌。

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

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

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

  • 路由器会查看应用程序以寻找要响应的内容,如果路由器找不到要响应的内容,路由器本身可能会返回一个404 Not Found error

示例

现在让我们通过一个简单的例子来加深对中间件的理解。 我们使用 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 诊断

    步骤 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 欢迎页面

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

    步骤 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 中间件。 它不会创建响应,所以它会转到我们的 app.Run 并显示字符串。

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

    运行时信息

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