这篇文章探讨了让不同的请求去使用不同的中间件,那么我们应该如何配置ASP.NET Core中间件?其实中间件只是在ASP.NET Core中处理Web请求的管道。所有ASP.NET Core应用程序至少需要一个中间件来响应请求,并且您的应用程序实际上只是中间件的集合。当然MVC管道本身就是中间件,早在WebForm时代就出现过HttpModules、HttpHandler、那个时候悠然记得我通过它们来组织我的广告系统,不闲扯我们继续。

  每个中间件组件都有一个带有HttpContext参数的Invoke方法。您可以使用这个参数来处理方法。

public async Task Invoke(HttpContext context){if (context.Request.Path...)    {await context.Response.WriteAsync("writing text...");    }}

  应用程序中最顶层的中间件将始终针对每个请求被调用。这是由.NET框架自动完成的。中间件可以向客户端发送响应,也可以调用下一个中间件。对于后一种选择,它当然需要访问下一个中间件组件。这就是为什么大多数中间件组件都是使用带有RequestDelegate参数的构造函数定义的。总之,RequestDelegate会自动填充,您无需在意。

   中间件在Startup.cs的Configure方法中注册。Configure方法具有IApplicationBuilder参数,该参数提供了所有类型的中间件注册所需的方法,我们试着去编写一个中间件。

public class MyCustomMiddleware    {private readonly RequestDelegate _next;public MyCustomMiddleware(RequestDelegate next)        {            _next = next;        }public async Task Invoke(HttpContext context, IWebHostEnvironment env)        {            context.Response.Headers["app-name"] = env.ApplicationName+"Zaranet";            context.Response.Headers["env-name"] = env.EnvironmentName+ "Zaranet";await _next(context);        }    }

随后我们在Startup.cs的Configure方法中通过 use 来注册自定义中间件。

public void Configure(IApplicationBuilder app, ...){    app.UseMyCustomMiddleware();}

  启动程序我们发现一些正常,我们得到了我们想要的效果。

  但实际上,您很少需要直接调用UseMiddleware,因为中间件作者的标准方法是编写特定于所注册中间件的扩展方法:

using MiddlerWareSolucation.MiddlerWare;using Microsoft.AspNetCore.Builder;

namespace MiddlerWareSolucation.MiddlerWare_Extensions{public static class MyCustomMiddlewareExtensions    {public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder app)        {            app.UseMiddleware<MyCustomMiddleware>();

return app;        }    }}

随后直接调用Extensions扩展方法,效果还是一样的。

public void Configure(IApplicationBuilder app, ...){    app.UseMyCustomMiddleware();}

部分时候我们想要通过客户端请求的路径来对我们的中间件进行启动,当然 MapWhen 允许您通过指定谓词将中间件管道分成两个完全独立的分支:

app.UseMiddlewareOne();

app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>{     appBuilder.UseMiddlewareTwo();});

app.UseMiddlewareThree();

在此示例中,中间件One将始终执行,如果请求路径以“ / api”开头,则将执行中间件Two。否则,将执行中间件Three。使用这种配置,中间件2和中间件3都无法针对单个请求执行。

我想说的是最后一种情况是,您希望大多数中间件针对所有请求运行,但是您有一些条件件-特定中间件仅应针对某些请求运行。

这可以通过UseWhen轻松实现,UseWhen还使用谓词来确定中间件是否应该运行:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>{    appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}");

    appBuilder.UseExceptionHandler("/apierror/500");});

这样就可以通过选择注册方式来自己控制中间件。

在ASP.NET Core中编写合格的中间件相关推荐

  1. 如何在ASP.NET Core中编写自定义日志记录提供程序

    目录 介绍 如何实现所需的接口 基础类和附件 FileLoggerProvider具体类及其附件 1. ConfigureLogging() 2. appsettings.json文件 介绍 源代码可 ...

  2. 如何在 ASP.NET Core 中使用 URL Rewriting 中间件

    URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...

  3. ASP.NET Core中HTTP管道和中间件的二三事

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:中间件是什么?在.NET Core中的工作原理又是怎样的呢? 配置ASP.NET Core请求(Request)处理管道 ...

  4. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(ASP.NET Core 之 Identity 入门(一),ASP.NET Core 之 Ident ...

  5. ASP.NET Core 中基于工厂的中间件激活

    IMiddlewareFactory/IMiddleware 是中间件激活的扩展点. UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware. 如果是,则使用在容器 ...

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

    ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且高度模块化的web框架,同时扩展性也是非常强,你可以在 request -> response 请求管道中安插各种中间件来根据 ...

  7. 理解ASP.NET Core中的中间件

    中间件是ASP.NET Core的一个重要特点,ASP.NET Core应用程序之所以能够灵活地处理各种各样的请求,完成都是由于中间件,那么它究竟是怎么一回事呢? 一.理解中间件 ASP.NET Co ...

  8. 如何使用C#在ASP.NET Core中轻松实现QRCoder

    by Yogi 由瑜伽士 如何使用C#在ASP.NET Core中轻松实现QRCoder (How to easily implement QRCoder in ASP.NET Core using ...

  9. 探索ASP.NET Core中的IStartupFilter

    原文:Exploring IStartupFilter in ASP.NET Core 作者:Andrew Lock 译者:Lamond Lu 在本篇博客中,我将介绍一下IStartupFilter, ...

最新文章

  1. Beta阶段总结博客(麻瓜制造者)
  2. 如何手动的用jigloo设计器关联java界面文件 jigloo 设计器失去关联解决
  3. STM32程序设计心得以及易错点
  4. python实现dns劫持_Python程序之DNS劫持
  5. boost::mpl模块实现map相关的测试程序
  6. C++基本数据类型解惑
  7. 基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础
  8. qt5 传输 图片压缩_图片如何转换成pdf?免费教你几个宝藏方法,请低调使用!...
  9. Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!...
  10. axure 发布 主页_车队如何在黑鸟APP发布同城活动?教程来了!
  11. 阿里云MaxCompute中pyODPS的使用:多线程上传、下载、分区
  12. kettle oracle数据从库到库,kettle 使用oracle数据库当做资源库
  13. 台哥算法练习 - 自己写的一个LinkedList
  14. 点评一下阿提亚和黎曼猜想
  15. 基于Python分析实现酒店评论的中文情感
  16. 适合自学的C语言基础视频教程
  17. 工业机器人——机械手臂
  18. 游戏术语扫盲贴(手游人必懂)
  19. Android Support Library介绍
  20. 【强化学习】PPO:从On-policy到Off-policy(PPO/TRPO/PPO-Penalty/PPO-Clip)

热门文章

  1. Linux内核升级,从2.6.18升级到3.2.14
  2. C# static readonly 与 const 的区别
  3. UVA 10518 How Many Calls?
  4. SQL利用Case When Then多条件判断
  5. Effective C# 原则35:选择重写函数而不是使用事件句柄(译)
  6. 新的Teams API权限控制
  7. 使用Ubuntu的公用文件夹轻松地在计算机之间共享文件
  8. cmd暂停快捷键_是否有键盘快捷键可以暂停正在运行的CMD窗口的输出?
  9. 关于CTeX的几个大坑
  10. Java基础知识回顾--线程