1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 如何在 ASP.NET Core 中 自定义中间件

如何在 ASP.NET Core 中 自定义中间件

时间:2023-07-18 08:18:51

相关推荐

如何在 ASP.NET Core 中 自定义中间件

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方法中你可以实现监视或者修改RequestResposne

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。