在ASP.NET Core中编写合格的中间件

  这篇文章探讨了让不一样的请求去使用不一样的中间件,那么咱们应该如何配置ASP.NET Core中间件?其实中间件只是在ASP.NET Core中处理Web请求的管道。全部ASP.NET Core应用程序至少须要一个中间件来响应请求,而且您的应用程序实际上只是中间件的集合。固然MVC管道自己就是中间件,早在WebForm时代就出现过HttpModules、HttpHandler、那个时候悠然记得我经过它们来组织个人广告系统,不闲扯咱们继续。html

  每一个中间件组件都有一个带有HttpContext参数的Invoke方法。您可使用这个参数来处理方法。api

public async Task Invoke(HttpContext context) { if (context.Request.Path...) { await context.Response.WriteAsync("writing text..."); } }

   应用程序中最顶层的中间件将始终针对每一个请求被调用。这是由.NET框架自动完成的。中间件能够向客户端发送响应,也能够调用下一个中间件。对于后一种选择,它固然须要访问下一个中间件组件。这就是为何大多数中间件组件都是使用带有RequestDelegate参数的构造函数定义的。总之,RequestDelegate会自动填充,您无需在乎。app

   中间件在Startup.cs的Configure方法中注册。Configure方法具备IApplicationBuilder参数,该参数提供了全部类型的中间件注册所需的方法,咱们试着去编写一个中间件。框架

public class MyCustomMiddleware { private readonly RequestDelegate _next; public MyCustomMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context, IWebHostEnvironment env) { context.Response.Headers["app-name"] = env.ApplicationName+"Zaranet"; context.Response.Headers["env-name"] = env.EnvironmentName+ "Zaranet"; await _next(context); } }

随后咱们在Startup.cs的Configure方法中经过 use 来注册自定义中间件。async

public void Configure(IApplicationBuilder app, ...) { app.UseMyCustomMiddleware(); }

  启动程序咱们发现一些正常,咱们获得了咱们想要的效果。函数

 

  但实际上,您不多须要直接调用UseMiddleware,由于中间件做者的标准方法是编写特定于所注册中间件的扩展方法:ui

using MiddlerWareSolucation.MiddlerWare;
using Microsoft.AspNetCore.Builder;
namespace MiddlerWareSolucation.MiddlerWare_Extensions { public static class MyCustomMiddlewareExtensions { public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder app) { app.UseMiddleware<MyCustomMiddleware>(); return app; } } }

随后直接调用Extensions扩展方法,效果仍是同样的。this

public void Configure(IApplicationBuilder app, ...) { app.UseMyCustomMiddleware(); }

 部分时候咱们想要经过客户端请求的路径来对咱们的中间件进行启动,固然 MapWhen 容许您经过指定谓词将中间件管道分红两个彻底独立的分支:spa

app.UseMiddlewareOne(); app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => { appBuilder.UseMiddlewareTwo(); }); app.UseMiddlewareThree();

在此示例中,中间件One将始终执行,若是请求路径以“ / api”开头,则将执行中间件Two。不然,将执行中间件Three。使用这种配置,中间件2和中间件3都没法针对单个请求执行。code

我想说的是最后一种状况是,您但愿大多数中间件针对全部请求运行,可是您有一些条件件-特定中间件仅应针对某些请求运行。

这能够经过UseWhen轻松实现,UseWhen还使用谓词来肯定中间件是否应该运行:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => { appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}"); appBuilder.UseExceptionHandler("/apierror/500"); });

这样就能够经过选择注册方式来本身控制中间件。

原文出处:https://www.cnblogs.com/ZaraNet/p/11799534.html

相关文章
相关标签/搜索