📜  ASP.NET Core-中间件

📅  最后修改于: 2020-11-21 04:53:11             🧑  作者: Mango


在本章中,我们将了解如何设置中间件。 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(args); 
   } 
} 

Configure()方法内部,我们将在IApplicationBuilder接口上调用扩展方法以添加中间件。

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

  • IISP平台处理程序
  • 向app.Run注册的中间件

IISP平台处理程序

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

向app.Run注册的中间件

在这种情况下,下一个中间件是在app.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-运行您的应用程序,您将看到以下欢迎屏幕。

欢迎屏幕

此欢迎屏幕可能没有用。

步骤6-让我们尝试一些可能更有用的方法。代替使用Welcome页面,我们将使用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 ”。现在,您将看到由该运行时信息页面中间件生成的页面。

运行时信息

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