Core 是一个跨平台,开源的,轻量级,高性能 并且高度模块化的web框架,同时扩展性也是非常强,你可以在request -> response
请求管道中安插各种中间件来根据自己的场景定制化,比如说:监视,路由,修改 request 或 response 消息体,这篇文章我们就来讨论 Core 中间件以及如何使用。
Core 中存在一条中间件
链条,这条链是由一组委托方法
组成,这些委托方法会一个接一个的被执行,request 请求会从这些中间件链条中流转,被流转到的组件,要么处理这个请求,要么将请求传给下一个中间件。
配置 中间件管道
中间件的管道配置是在 Startup.Configure 方法中 ,准确的说这里就是组装你的 Core 请求管道,运行时会自动调用这个 Configure 方法,代码如下:
publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv,ILoggerFactoryloggerFactory,IdentityDbContextdbContext){app.UseDeveloperExceptionPage();app.UseStaticFiles();app.UseMvcWithDefaultRoute();}
上面的代码展示了如何将 mvc 添加到 Core 的请求处理管道
中,接下来准备实现自定义中间件。
创建自定义中间件
可以利用IApplicationBuilder
接口的扩展方法来构建你的中间件,为了代码可维护性,建议将自定义的中间件逻辑单独放在一个类中,或者一个单独的项目中,这样你在更新这些代码的时候不需要更新业务逻辑层的代码。
有多种方法可以构建自定义中间件,我准备来演示那最简单的一种,首先创建一个名为MyCustomMiddleware
的cs类,骨架代码大概是这样:
publicclassMyCustomMiddleware{//Thisisourcustommiddleware}
接下来在类的构造函数中新增一个 RequestDelegate 参数,这个 RequestDelegate 委托的签名是接收HttpContext
参数 并返回 Task,下面是修改后的 MyCustomMiddleware。
publicclassMyCustomMiddleware{privatereadonlyRequestDelegate_next;publicMyCustomMiddleware(RequestDelegatenext){_next=next;}}
执行 自定义中间件
现在需要给MyCustomMiddleware
提供一个可执行的方法,供处理流
执行到这个类时执行此方法,就是下面的Invoke
,有些朋友可能要问了,为啥一定是Invoke
方法,可以是其他的吗?不可以的,这是 Core 中间件中约定的方法名,Invoke
方法中你可以实现监视或者修改Request
或Resposne
。
publicclassMyCustomMiddleware{privatereadonlyRequestDelegate_next;publicMyCustomMiddleware(RequestDelegatenext){_next=next;}publicasyncTaskInvoke(HttpContexthttpContext){if(!httpContext.Request.Headers.Keys.Contains("Authentication-Key")){httpContext.Response.StatusCode=400;awaithttpContext.Response.WriteAsync("Authenticationkeyismissing...");return;}else{//Writecodeheretovalidatetheauthenticationkey.}await_next.Invoke(httpContext);}}
参考上面的代码,中间件的作用就是判断request header
中有没有有效的authentication key
,如果没有就会返回具体的错误信息给客户端。
创建扩展方法
接下来为刚才创建的自定义中间件
创建一个扩展方法,这么做的目的就是可以方便将中间件
注入到 pipeline 中,官方的推荐做法就是在IApplicationBuilder
接口上进行扩展,下面的代码展示了如何去实现。
publicstaticclassMyCustomMiddlewareExtensions{publicstaticIApplicationBuilderUseMyCustomMiddleware(thisIApplicationBuilderbuilder){returnbuilder.UseMiddleware<MyCustomMiddleware>();}}
最后要做的就是在Configure
方法下进行配置,在 app 参数下使用UseMyCustomMiddleware()
即可,如下代码所示:
publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv){app.UseMyCustomMiddleware();}
最后将程序跑起来,如下图:
从上面输出中可以看到,我的自定义中间件起作用了,可以看出中间件的做法让web程序
扩展性大大提高,如果你想了解更多中间件的知识,可参考:/en-us/aspnet/core/fundamentals/middleware/?tabs=aspnetcore2x&view=aspnetcore-5.0
译文链接:/article/3247624/how-to-build-custom-middleware-in-aspnet-core.html