Asp.net core中间件实现原理及用法解说
简述asp.net core中间件的实现思路?原文地址:https://www.cnblogs.com/shengyu-kmust/p/11583974.html 一次http请求的过程,就是对一个Request请求进行若干次逻辑处理,并最终设置Response的过程。从代码的实现维度看,由于Request和Response都在HttpContext里,可将此过程表示为“以一个httpContext为输入的委托函数”,即delegate Task RequestDelegate(HttpContext context),为方便此文的描述,我们将此委托函数暂时称为“请求处理逻辑” ? ? 而中间件的作用,就是在请求的后面加入一个处理逻辑,这个处理逻辑是以“前一个请求处理逻辑”为输入,并经过中间件自己的处理后,返回一个“新的请求处理逻辑”。所以从代码上可将“中间件”表式为以一个“请求处理逻辑”为输入并返回另一个“请求处理逻辑”的委托,即Func<RequestDelegate,RequestDelegate>。而多个中间件即表示为List<Func<RequestDelegate,RequestDelegate>>。 ? ? Asp.net core中间件的核心功能就是如何将一系列的中间件,合并成一个“请求处理逻辑”的过程,即如何将List<Func<RequestDelegate,RequestDelegate>>合并生成一个RequestDelegate。合并逻辑如下 ? ? 上面的代码有两个地方要注意 1、asp.net core会默认在请求的最后加入一个“404”处理的中间件。 ?? 2、合并时,组件是先反序后再循环的 ???因先加入的中间件要先执行,所以在合并时,第一个中间件要最后合并,即要倒序后再循环合并中间件 ? 如何使用中间件使用中间件有四种方法:Use、Run、Map和使用Middleware class,但前三种方法最终调用的都是Use方法,我们来看看Use方法的实现逻辑,如下 ? ? 即use方法只是在中间件列表(_components)的最后再加入一个中间件 ? 下面详细描述四种方法的用法 ? Use的用法Ues的用法有两种 用法一 调用IApplicationBuilder Use(Func<RequestDelegate,RequestDelegate> middleware),此用法需在middleware委托里自己控制是否要进入下一个中间件,并且要自己创建一个RequestDelegate并返回,写法会比较复杂。 示例如下 ? 用法二 调用IApplicationBuilder Use(this?IApplicationBuilder app,Func<HttpContext,Func<Task>,Task> middleware),这是一个扩展方法,此方法不用自己创建RequestDelegate并返回,写法比较简洁。它最终调用的方法还是用法一中的实现,此方法的实现代码如下。 ? 示例如下 ? ? 需注意:上面的两种Use用法,在第二个中间件时,并没有再调用下一个中间件,这是为了确保http请求不会进入到asp.net core默认的最后一个404中间件,因为最后一个404中间件设置了status code,而一但response body之前已经开始写入时,是不能再改变status code或是request header的,否则会报错。微软的官方文档里要求中间件的使用要遵循如下规则:如response body改变后就不要再调用下一个中间件,避免下一个中间件对上一个中间件的httpcontext内容的污染。(本文示例为演示目的,未遵循此约定) ? ? ? run的用法run方法的实现代码如下 ? 注意:从run方法的实现的代码可以看出,run是不会再执行下一个中间件的,所以第一个中间run方法后面的中间件都不会起作用。所以一般用run时都是放在中间件的最后 ? ? map的用法map其实准确来说不是中间件的用法,而是新开一个“中间件请求路线分支”,在这个“分支”里,可以再用use和run方法来组件一个新的中间件逻辑。 示例如下 ? 如上示例,请求地址当能匹配上/test里,才会启用map里的中间件 ? Middleware class的用法Middleware class不需要继承任何类或是接口,但必须有名为Invoke,返回类型为Task,且第一个参数为HttpContext类型的方法。 示例如下 ? ? ? ? Asp.net core内置中间件的介绍?
? ? 中间件的总结1、通过use,run,map,middleware class四种方法使用 2、使用多个中间件时,需注意中间件的顺序 3、在设计中间件时,请遵循“责任分离”原则,即一个中间件只对“单一责任”进行处理,如验证用户、授权等。 4、如果对response body做了修改后,请不要再执行下一个中间件 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – Global.asax没有为Release版本触发
- asp.net-mvc – Visual Studio不允许在MVC视图中使用断点
- asp.net-mvc – ASP.NET不向客户端发送上传进度
- asp.net – 在Microsoft Windows Azure上设置网站的默认网页
- asp.net-mvc – 401在MVC API中使用Microsoft Azure Active
- asp.net-mvc – 如果ASP.NET MVC中的用户匿名,则重定向到自
- asp.net – 开发的理想开发/测试/ QA环境
- asp.net – 在WiX安装程序中的应用程序池上设置禁用重叠循环
- asp.net – 流程模型minFreeThreads澄清
- asp.net – WCF与Web-api平台中的数据和事务
- ASP.NET核心项目:如何防止编写原型
- asp.net-mvc-3 – 具有最佳实践的示例N层ASP.NET
- asp.net – TransferRequestHandler和BeginReque
- asp.net-mvc – 在ASP.NET MVC中保护NullReferen
- asp.net-mvc – 在MVC API中接受字节数组参数作为
- asp.net – “2015年4月20日Google帐户的OpenID2
- asp.net-mvc-3 – ASP.NET MVC3 CSS框架
- asp.net-mvc – 服务层验证
- asp.net-mvc – 如何使用表单身份验证提供保持登
- 如何在.NET中使用TreeView控件创建三态复选框?