湖南省房屋和城乡建设部网站,做论坛网站 备案,wordpress需要先安装数据库吗,做网盟的网站必须备案中间件是ASP.NET Core的一个重要特点#xff0c;ASP.NET Core应用程序之所以能够灵活地处理各种各样的请求#xff0c;完成都是由于中间件#xff0c;那么它究竟是怎么一回事呢#xff1f;一、理解中间件ASP.NET Core的一个主要特点是中间件#xff08;Middleware#xf… 中间件是ASP.NET Core的一个重要特点ASP.NET Core应用程序之所以能够灵活地处理各种各样的请求完成都是由于中间件那么它究竟是怎么一回事呢一、理解中间件ASP.NET Core的一个主要特点是中间件Middleware它通过中间件来处理传入的HTTP请求并将处理结果返回给发起请求的客户端。多个中间件构成了中间件管道Middleware pipeline也称为请求管道。之所以称其为管道是因为请求能够从一个中间件进入另一个中间件并以相反的顺序再出来如下图。对于一个ASP.NET Core应用程序所有向它发送的请求都是通过它里面添加的中间件来进行处理并返回响应比如显示网站的首页、对用户的认证、请求静态文件CSS、JavaScript文件等等。另外需要注意的是传入的请求不一定会遍历到所有添加的中间件有可能在经过某一个中间件处理时直接返回响应而不再继续前进比如如果用户没有通过认证或者程序出现异常时就不会再继续被下一个中间件处理。二、Program与Startup在一个ASP.NET Core应用中最主要的文件有两个一个是Program.cs另一个是Startup.cs其中Program.cs里包含了程序的入口即Program类中的Main函数。而Startup.cs文件中的Startup类则是用来配置当前应用程序。Startup类包含了两个方法即ConfigureServices和Configure其中前者主要是用于向依赖注入容器添加服务而后者则是用于为当前程序配置处理HTTP请求的请求管道在这个方法里我们可以根据需要添加多个中间件。public class Startup
{public void ConfigureServices(IServiceCollection services){// 向依赖注入容器添加服务}public void Configure(IApplicationBuilder app, IHostingEnvironment env){// 配置中间件管道 }
}三、添加中间件添加中间件的方法有3种这3种方法都是通过Configure方法的参数IApplicationBuilder接口所提供的方法实现的这个接口提供Use、Map以及Run方法均能够用来添加中间件。1、Run方法最简单它仅处理请求并不会将请求传入下一个中间件。因此对于如下代码会直接返回包含一串字符的响应。app.Run(async (context) { await context.Response.WriteAsync(Hello World!);});
2、Use方法与Run方法不同的是它在处理请求后还可以把请求传递给下一个中间件并由其继续处理。public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{app.Use(async (context, next) {if (context.Request.Path.Value /welcome){await context.Response.WriteAsync(Hello World!);}else{Debug.WriteLine(中间件 A 开始);// ....await next();// ...Debug.WriteLine(中间件 A 结束);}});app.Run(async (context) {await context.Response.WriteAsync(Hello World!);});
}
以上代码的运行结果是显示“中间件 A 开始” - 在响应正文中写入信息 - 显示“中间件A结束。注意尽管Use方法能够让下一个中间件继续处理请求它也可以直接处理不再继续向前在上例中如果访问/welcome将直接返回响应。3、Map方法允许指定一个条件如果请求符合该条件则会新建一个分支并在该分支上继承处理请求而当请求处理结束后不返回原来的分支。public void Configure(IApplicationBuilder app)
{app.Use(async (context, next) { Console.WriteLine(中间件 A开始);await next();Console.WriteLine(中间件 A结束);});app.Map(new PathString(/map),a a.Use(async (context, next) {Console.WriteLine(中间件 B开始);await next();Console.WriteLine(中间件 B结束);}));app.Run(async context {Console.WriteLine(中间件 C);await context.Response.WriteAsync(Hello world);});
}
当请求/map后其结果如下中间件 A开始
中间件 B开始
中间件 B结束
中间件 A结束
可以看到中间件C并未执行。事实上除了以上3个方法ASP.NET Core还提供了UseWhen和MapWhen这两个方法它们能够以更复杂的方式来添加中间件。通过上面的介绍我们可以明白两点第一中间件并不复杂它本质上就是用于处理HTTP请求的一段代码第二点中间件的添加顺序很重要因为它的添加顺序将决定应用程序如何处理HTTP请求。四、自定义中间件通过上面的方式添加的中间件我们可以称为内联中间件Inline Middleware这种方式在实际开发中很少见更常见的方式是创建自定义中间件类也即添加一个类通过这个类来代表中间件并实现其功能。而这个类需要满足两个条件第一它包含一个带有RequestDelegate类型参数的构造函数这个RequestDelegate类型的参数表示在请求管道中的下一个中间件第二它包含一个Invoke方法该方法接受一个HttpContext类型的参数并且这个方法的返回值为Task这个HttpContext类型的参数即表示传入的HTTP请求。以下是一个典型自定义中间件public class CheckRequestPathMiddleware
{private RequestDelegate _next;public CheckRequestPathMiddleware(RequestDelegate requestDelegate){this._next requestDelegate;}public Task Invoke(HttpContext context){if (context.Request.Path.Value /about){context.Response.ContentType text/plain;charsetutf-8;context.Response.WriteAsync(Hello, 这条消息由自定义中间件输出);return Task.CompletedTask;}else{return _next(context);}}
}
当中间件创建好之后要在Startup类中的Configure方法中把它添加到管道中只要使用IApplicationBuilder接口的UseMiddleware方法。app.UseMiddlewareCheckRequestPathMiddleware();
ASP.NET Core提供了很多中间件它们能够满足开发Web应用程序时所需要的各种功能这些中间件包括MVC、认证、静态文件、HTTPS重定向、CORS等。以下代码显示了一个标准应用程序所添加的中间件。public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler(/Home/Error);// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles();app.UseCookiePolicy();app.UseMvc(routes {routes.MapRoute(name: default,template: {controllerHome}/{actionIndex}/{id?});});
}
以上这些以Use开头的方法均是向请求管道添加相应的中间件。我们可能注意到这些方法并不像我们刚才介绍的添加中间件的方法那样即要么使用Use/Map/Run等要么使用UseMiddleware方法。这里需要说明的是以上这些以Use开头的方法本质上也是使用了UseMiddleware方法来添加中间件的。这些方法只不过是通过额外定义的一个扩展方法来更方便地添加相应的中间件而已。我们同样也可以创建类似的扩展方法以方便别人使用我们所创建的自定义中间件。public static class CheckRequestPathMiddlewareExtentions
{public static void UseCheckRequestPathMiddleware(this IApplicationBuilder app){app.UseMiddlewareCheckRequestPathMiddleware();}
}
通过上面这个方法我们就可以在Configure方法中直接调用app.UseCheckRequestPathMiddleware方法来添加这个自定义中间件了。总结本文简要地介绍了ASP.NET Core中所引入的中间件的概念以及其使用方法中间件极大地方便了应用程序对HTTP请求的处理。多个中间件构成的管道为ASP.NET Core应用程序提供了更灵活的、更轻量的HTTP请求处理方式。