如何在 ASP.Net Core 中使用条件中间件

ASP.Net Core 是微软开源的跨平台、可扩展、轻量级的模块化框架,可用于构建高性能的web应用程序。中间件组件可以注入到 ASP.Net Core 请求管道中实现对 Request 和 Response 的定制和修改。 2021-01-26 14:57:00 中间件应用模块化 自学Python需要多长时间从入门到精通? 自学Python需要多长时间?Python是全球前3大很流行的编程语言之一,以其简洁优美、功能强大、高效率的先天优势成为企业新宠此外,国内计算机教育也越来越重视Python在编程中的地位。Python非常适合零基础的同学学习,比较简单没有指针变量类型等复杂的概念。 2021-01-26 14:05:30 Python编程语言编程 鸿蒙移植树莓派(下)修改源码 文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz 2021-01-26 13:50:43 鸿蒙HarmonyOS应用开发 用动图讲解分布式 Raft Raft 算法是分布式系统开发首选的共识算法。比如现在流行 Etcd、Consul。 2021-01-26 13:27:11 分布 Raft 算法 一道JS笔试题, 刷新了我对map方法函数的认知,你做对了吗? 本篇通过一道JS笔试题,来和大家聊聊我对map方法函数的认知。 2021-01-26 13:14:14 js前端map 探讨:Redux这么有名,只是我们不合适 当聊到React状态管理方案,很多人第一反应是Redux。合适的出现时机加上大名气,催生Redux相关生态在社区快速发展,成为很多前端团队标配。 2021-01-26 12:53:12 ReduxReact前端 效率倍增!5款非常超级实用的Python工具 近年来,随着人工智能和云计算的蓬勃发展,Python 也迅速成为了网红语言。它之所以广受好评,这得益于开源的生态社区。 2021-01-26 12:16:00 Python开发工具 编写 Python 代码时要有所取舍 本文是 Python 之禅特别系列的一部分,重点此篇着眼于第七、八、九条原则:可读性、特殊情况和实用性。 2021-01-26 11:49:35 Python软件开发代码 如何实现一个前端监控回放系统 本文通过各类调研以及实际项目开发中总结的经验,以记录在实现前端监控回放系统的过程中会用到的一些 Web API 与新技术能力,为大家提供一些可行的实现思路。

ASP.Net Core 是微软开源的跨平台、可扩展、轻量级的模块化框架,可用于构建高性能的web应用程序。中间件组件可以注入到 ASP.Net Core 请求管道中实现对 Request 和 Response 的定制和修改。

[[378514]]

ASP.Net Core 是微软开源的跨平台、可扩展、轻量级的模块化框架,可用于构建高性能的web应用程序。中间件组件可以注入到 ASP.Net Core 请求管道中实现对 Request 和 Response 的定制和修改。

ASP.Net Core 中间件可以用于检查、路由或者修改流转于Pipeline的Request和Response。本文将会讨论如何使用这些中间件来实现一些高级操作。

Use,Run,Map方法

介绍Use、Map,Run方法常用来一起构建 HTTP Pipeline 管道,下面快速浏览一下这些方法和它们的用途。

  • Use

该方法将会执行一个委托,然后将 交接棒 传给Pipeline的下一个中间件,因该方法短暂拥有交接棒,所以该方法可用于 短路操作。

  • Run

该方法会执行委托并返回结果。

  • Map

该方法将有条件地执行委托并返回结果。

注册中间件

中间件是在 Startup.Configure 中进行注册,调用方法就是 Use*系列扩展方法,下面是注册中间件的语法。

  1. publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv)
  2. {
  3. app.UseMyCustomMiddleware<MyCustomMiddleware>();
  4. }

需要注意的是,中间件的执行顺序和你注册的顺序是保持一致的。

Invoke 方法

每个中间件都包含一个 Invoke() 方法, 这个方法参数是 HttpContext 的一个实例,本中间件的业务逻辑会在下一个中间件的执行前后都会被执行,如果你有点懵的话,可以了解一下什么叫:递归调用,如下面代码注释所示:

  1. publicasyncTaskInvoke(HttpContextcontext)
  2. {
  3. //Writecodeherethatwillbeexecutedbeforethe
  4. //nextmiddlewareiscalled
  5. await_next.Invoke(context);//callnextmiddleware
  6. //Writecodeherethatwillbeexecutedafterthe
  7. //nextmiddlewareiscalled
  8. }

分流 Http 管道

Map系扩展方法,比如:Map 和 MapWhen,它们常用于给 pipeline 管道操作进行分流,前者是基于 Request path 进行分流,后者是基于指定的 谓语动词 进行分流。

下面的代码片段展示了如何使用 Map 方法对 Request Pipeline 进行分流。

  1. publicclassStartup
  2. {
  3. privatestaticvoidMapRequestA(IApplicationBuilderapp)
  4. {
  5. app.Run(asynccontext=>
  6. {
  7. awaitcontext.Response.WriteAsync("ThisisMapRequestA");
  8. });
  9. }
  10. privatestaticvoidMapRequestB(IApplicationBuilderapp)
  11. {
  12. app.Run(asynccontext=>
  13. {
  14. awaitcontext.Response.WriteAsync("ThisisMapRequestB");
  15. });
  16. }
  17. privatestaticvoidMapRequestC(IApplicationBuilderapp)
  18. {
  19. app.Run(asynccontext=>
  20. {
  21. awaitcontext.Response.WriteAsync("ThisisMapRequestC");
  22. });
  23. }
  24. publicvoidConfigure(IApplicationBuilderapp)
  25. {
  26. app.Map("/mapRequestPathA",MapRequestA);
  27. app.Map("/mapRequestPathB",MapRequestB);
  28. app.Map("/mapRequestPathB",MapRequestC);
  29. app.Run(asynccontext=>
  30. {
  31. awaitcontext.Response.WriteAsync("HelloWorld!");
  32. });
  33. }
  34. //Othermethods
  35. }

MapWhen 方法接受两个参数:

  • Func<HttpContext, bool> predicate
  • delegate action

你可以在 Startup.Configure 方法中拒绝 text/xml 格式的 request,如下代码所示:

  1. publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv)
  2. {
  3. if(env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. app.MapWhen(context=>context.Request.ContentType.Equals
  8. ("text/xml",StringComparison.InvariantCultureIgnoreCase),
  9. (IApplicationBuilderapplicationBuilder)=>
  10. {
  11. applicationBuilder.Run(asynccontext=>
  12. {
  13. awaitTask.FromResult(context.Response.StatusCode=StatusCodes.Status406NotAcceptable);
  14. });
  15. });
  16. app.UseMvc();
  17. }

使用 UseWhen

UseWhen方法可以用于有条件的执行中间件,下面的代码片段展示了如果当前 Request 请求路径是以 /api 开头的话,执行一个指定的中间件,代码如下:

  1. app.UseWhen(context=>context.Request.Path.StartsWithSegments("/api"),applicationBuilder=>
  2. {
  3. applicationBuilder.UseCustomMiddleware();
  4. });

请注意,UseWhen 不像 MapWhen,前者会继续执行后面的中间件逻辑,不管当前 UseWhen 的委托函数返回的是 true 还是 false,如果有点懵的话,可以理解一下下面的代码:

  1. app.UseMiddlewareA();
  2. app.UseWhen(context=>context.Request.Path.StartsWithSegments("/api"),applicationBuilder=>
  3. {
  4. applicationBuilder.UseMiddlewareB();
  5. });
  6. app.UseMiddlewareC();

如果中间件没有短路,那么中间件A和C肯定会被执行的,而且当请求路径是以 /api 开头时,中间件B也会被调度。

在 ASP.Net Core 请求处理管道中有一个中间件链,所有请求和响应都流经此管道,当新请求到达时,这些中间件要么处理请求,要么将请求传递给管道中的下一个组件,对于更复杂的请求处理,我们可以使用 Map 和 MapWhen 方法来分流管道,并可以使用 UseWhen 有条件的执行中间件。

译文链接:https://www.infoworld.com/article/3429602/how-to-use-conditional-middleware-in-aspnet-core.html

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 15:47
下一篇 2023年5月5日 15:47

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信