谈ASP.NET核心中间件详解及项目实战
序
本文实际用于我们自己项目的开发,符合实际应用,被视为对中间件的深入使用,而不是简单的Hello World。
中间件的作用
我们知道,任何web框架都是将http请求封装到一个管道中,每个请求都是通过管道的一系列操作,最后到达我们编写的代码。那么中间件就是应用程序管道中的一个组件,它用于拦截请求过程,以进行其他一些处理和响应。可以有很多中间件,每个中间件都可以拦截管道中的请求,并且可以决定是否将请求传递给下一个中间件。
asp.net核心提供IApplicationBuilder接口,将中间件注册到ASP.NET的管道请求中。中间件是典型的AOP应用。每个中间件都可以在请求前后运行。处理完请求后,它将被传递给下一个请求。
中间件的运行模式
默认情况下,中间件的执行顺序是按照Startup.cs文件中public void configure(iapplicationbuilder app){ }方法中注册的顺序执行的。
在管道中注册“中间件”大约有三种方法
1.app.Use(),由IApplicationBuilder接口原生提供,用于注册。
2.app.Run(),一个扩展方法,需要一个RequestDelegate委托,它包含Http的上下文信息,没有next参数,因为它总是在管道的最后一步执行。
3.app.Map()也是一种扩展方法,类似于MVC路由,一般用于处理一些特殊的请求路径。比如www.example.com/token.
上面的运行和映射也称为使用,它是应用构建器接口的扩展。如果你觉得名字不够准确,那么下面的扩展方法就是正宗的注册中间件,而且它也是最强大的。
App。UseMiddleware(),是的,就是这样。为什么强大?因为它不仅提供了注册中间件的功能,还提供了依赖注入(DI)的功能,未来大部分情况下都会用到。
中间件和过滤器的区别
熟悉MVC框架的同学应该知道,MVC还为我们提供了五个过滤器来处理请求前后要执行的代码。它们是身份验证过滤器、授权过滤器、操作过滤器、异常过滤器和结果过滤器。
根据描述,我们可以看到中间件和过滤器功能相似,那么它们有什么区别呢?为什么要构建中间件?事实上,过滤器和中间件有不同的关注点,也就是说,它们有不同的责任,做不同的事情。
比如栗子,中间件就像埃辛诺斯的刀锋,过滤器就像巨龙之怒,还有泰蕾苟萨的灵魂派遣杖。你是一名士兵,带着巨龙之怒和泰蕾苟萨的灵魂派遣杖在战场上杀人。虽然都是伤害,你不说伤害低,但是你也降低了属性。
过滤器作为AOP的两大利器,更适合商业。他们关注应用程序本身。例如,查看ActionFilter和ResultFilter。它们都直接与你的行动和行动结果互动。离你近吗?然后我有一些事情,比如格式化我的输出结果,并验证我请求的视图模型的数据。肯定是用滤镜。它是MVC的一部分,可以截取你的Action上下文的一些信息,但是中间件没有这个能力。
我们在什么情况下需要中间件
那么,什么时候使用中间件呢?我的理解是,一些需要在管道中完成的事情,如身份验证、会话存储、日志记录等,都可以在我们的应用程序中使用。实际上,我们在ASP.NET的核心项目已经包含了许多中间件。
例如,当我们创建一个新的ASP.NET核心应用程序时,默认生成的模板
公共无效配置(应用程序生成器应用程序,ILoggerFactory logger factory){ app .usedeveloper异常页();应用程序.UseStaticFiles();伐木工厂AddConsole();应用程序.UseMvc(routes={ routes .MapRoute(名称: '默认',模板: ' {控制器=Home }/{操作=Index }/{ id?}');});}懒得去下载源码了,我们使用反射镜去查看源码:
//扩展方法`应用。usedeveloper异常页();`公共静态类开发人员异常页面扩展{//方法公共静态IApplicationBuilder usedeveloper异常页面(此IApplicationBuilder应用程序){ if(app==null){ 0引发新的argumentNullException(' app ');}返回使用中间件扩展.usemiddlewareddeveloper异常页面中间件(应用程序,数组.空对象());}}//扩展方法`应用。usestaticfiles();`公共静态类staticfilextensions {//Methods公共静态IApplicationBuilder使用静态文件(此IApplicationBuilder应用程序){ if(app==null){ 0抛出新的argumentNullException(' app ');}返回使用中间件扩展.使用中间件(应用程序、阵列.空对象());}}可以看到应用程序.UseDeveloperExceptionPage(),应用程序使用静态文件()等等都是通过中间件实现的。
怎么样自定义自己的中间件
背景:我们项目使用到中间件的情景是,需要和其他部门进行用户(用户)信息的共享。以平台和子系统举例,我们正在开发一个子系统,其中用户信息,登录,注册等功能是放在平台上的,这是一个跨多语言的系统,平台是爪哇语言开发,用户在访问子系统的一些页面的时候需要验证是否登录,另外一些页面是不需要验证是否登录的,所以需要一个身份验证系统来代替身份的功能。
幸运的是微软已经给我们提供了一套身份验证的中间件,在微软。身份验证命名空间下,我们只需要拓展,添加自己的功能就行了。具体怎么做呢?直接看代码吧。
根据约定俗成,中间件类需要有一个引起方法,签名是公共异步任务调用(HttpContext上下文){},下面是一个中间件的示例类:
公共类RequestDelegate中间件{ private readonly request delegate _ next;私有只读ILogger _ logger公共请求记录中间件(RequestDelegate next,ILoggerFactory logger factory){ _ next=next;_logger=loggerFactory .createlogerrequestlogermiddleware();}公共异步任务调用(HttpContext)上下文{ _logger .登录信息('处理请求: '上下文。请求。路径);等待下一个调用(上下文);_记录器.登录信息('请求处理完毕');}}了解了上面的约定之后,我们就开始定义我们自己的中间件一班。
我们需要一个流程图来理清逻辑思路,以便于写代码的时候思路更加的清晰。
平台有一个要求就是,用户在我们子系统退出之后,要调用平台的一个接口通知他们,他们要做一些后续的业务。
好的,开始撸码。
首先创建一个平台授权中间件,它继承于微软。身份验证下的类认证中间件,由于认证中间件已经实现了引起功能,所以我们只需要重写(覆盖)它里面的一些方法就可以了。等等,我们好像还需要一些配置,比如流程图中的返回Url,平台的饼干的钥匙值,平台验证用户合法性的接口地址等参数。建立一个选择类进行配置的设置,我们取名字为:平台验证选项,继承认证选项,并且实现掉IOptionsT接口,这样子就能在启动中直接配置了。我们只需要重写认证中间件中的CreateHandler方法就行了,在处理者中可以实现掉我们中间件的功能。然后创建一个处理的处理者类,取名为平台验证处理程序,继承于AuthenticationHandlerTOptions用来处理请求中的调用。至此,我们的核心需要的类已经建立完了,剩下的就是填充代码。
1.在平台验证处理程序中重写HandleAuthenticateAsync()方法,进行主流程的控制。
2.在平台验证处理程序中重写FinishResponseAsync()方法,进行会议的存储操作。
3.在平台验证处理程序中重写HandleSignOutAsync()方法,进行登出的控制,因为用户登出之后我们要通知平台做一些其他操作。
4.在平台验证处理程序中重写HandleUnauthorizedAsync()方法,进行未认证操作。
最后,我们需要一个扩展类来把我们的中间件以扩展方法注册到管道当中去。
公共静态类MiddlewareExtensions {公共静态iapresentonbuilder UsePlatformAuthentication(此iappressionbuilder应用程序){ if(app==null){抛出新的ArgumentNullException(app的名称));}返回应用程序使用中间件平台authenticationmiddleware();}公共静态IApplicationBuilder UsePlatformAuthentication(此IApplicationBuilder应用程序,CookieAuthenticationOptions选项){ if(app==null){ 0抛出新的ArgumentNullException(应用程序的名称));} if(options==null){ 0抛出新的ArgumentNullException(选项的名称));}返回应用程序。使用中间件平台身份验证中间件(选项。创建(选项));}}在启动中就是应用程序.UsePlatformAuthentication()
公共空配置(IApplicationBuilder应用程序,IHostingEnvironment env,ILoggerFactory记录器工厂){记录器工厂.添加控制台(配置GetSection('日志');//注册平台验证中间件应用程序.UsePlatformAuthentication(new PlatformAuthenticationOptions(){ UserSessionStore=new UserSessionStore(),});应用程序.UseMvc();}现在,我们的中间件核心业务流程的实现已经出来了,我就不大篇幅的粘贴代码了,会影响阅读,感兴趣具体实现的朋友可以去下面的地址查看代码,有具体流程的注释。
示例源码:演示
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:谈ASP.NET核心中间件详解及项目实战是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。