文章目录

  • 前言
    • 1.功能开关的概念
    • 2.功能开关的优点
  • 一、ASP.NET Core中间件实现
    • 1.相关依赖
    • 2.中间件代码
    • 3.在管道中的使用
    • 4.修改配置控制
  • 二、IFeatureFilter过滤器
    • 1.过滤去代码
    • 2.配置文件
    • 3.改写功能开关中间件

前言

1.功能开关的概念

功能开关,相当于可以控制访问的流转和访问的允许和禁止。例如东京在6月18日做店庆促销活动,在交易下单环节,可能需要调用A、B、C三个接口来完成,但是其实A和B是必须的,C只是附加的功能(例如在下单的时候做一下推荐),可有可无,在平时系统没有压力,容量充足的情况下,调用下没问题,但是在类似店庆之类的大促环节,系统已经满负荷了,这时候其实完全可以不去调用C接口,怎么实现这个呢?改代码?no,no,no,这样太不敏捷,此时开关诞生了,开发人员只要简单执行一下命令或者点一下页面,就可以关掉对于C接口的调用,在大促过去之后,再把开关恢复回去即可。

2.功能开关的优点

功能开关(Feature flags)就是这样一种部署技术。

  • 可以提高应用程序的灵活性。
  • 可以将新功能部署到生产环境中,但限制其可用性。
  • 可以为控制是否激活一项新功能,而无需重新启动应用程序或部署新代码,它们将新功能的发布与代码部署分离。

一、ASP.NET Core中间件实现

1.相关依赖

我们需要引用nuget包Microsoft.FeatureManagement.AspNetCore,并在ConfigureServices中添加扩展

public void ConfigureServices(IServiceCollection services)
{...services.AddFeatureManagement();...
}

setting.json文件增加配置

"FeatureManagement":
{"ForbiddenDebugEndpoint": false
}

2.中间件代码

public class DebugMiddleware : IMiddleware
{private readonly IFeatureManager _featureManager;public DebugMiddleware(IFeatureManager featureManager){_featureManager = featureManager;}public async Task InvokeAsync(HttpContext context, RequestDelegate next){var isDebugEndpoint = context.Request.Path.Value.Contains("/test");var debugEndpoint = await _featureManager.IsEnabledAsync("ForbiddenDebugEndpoint");if (isDebugEndpoint && debugEndpoint){context.SetEndpoint(new Endpoint((context) =>{context.Response.StatusCode = StatusCodes.Status403Forbidden;return Task.CompletedTask;},EndpointMetadataCollection.Empty,"无权访问"));}await next(context);}
}

3.在管道中的使用

app.UseMiddleware<DebugMiddleware >()

4.修改配置控制

关键就是这句话,我们使用了功能开关:

var debugEndpoint = await _featureManager.IsEnabledAsync("ForbiddenDebugEndpoint");

只需要在配置文件中设置ForbiddenDebugEndpoint值为truefalse就可以控制

"FeatureManagement":
{"ForbiddenDebugEndpoint": false
}

二、IFeatureFilter过滤器

IFeatureFilter(功能过滤器)可用于确定是否满足某些条件以启用一项功能。功能过滤器可以自由使用任何可用的标准,例如流程状态或请求内容。
可以为给定功能注册功能过滤器,如果任何特征过滤器评估为真,该特征将被考虑启用。

1.过滤去代码

public class DebugFeatureSettings
{public string[] DebugEndpoints { get; set; }
}[FilterAlias("DebugFeatureFilter")]
public class DebugFeatureFilter : IFeatureFilter
{private readonly IHttpContextAccessor _httpContextAccessor;public DebugFeatureFilter(IHttpContextAccessor httpContextAccessor){_httpContextAccessor = httpContextAccessor;}public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context){var settings = context.Parameters.Get<DebugFeatureSettings>();foreach (var endPoint in settings.DebugEndpoints){var isDebugEndpoint = _httpContextAccessor.HttpContext.Request.Path.Value.Contains(endPoint);return Task.FromResult(isDebugEndpoint);}return Task.FromResult(false);}
}

2.配置文件

"FeatureManagement": {"ForbiddenDebugEndpoint": {"EnabledFor": [{"Name": "DebugFeatureFilter","Parameters": {"DebugEndpoints": [ "/test" ]}}]}
}

3.改写功能开关中间件

public class DebugMiddleware : IMiddleware
{private readonly IFeatureManager _featureManager;public DebugMiddleware(IFeatureManager featureManager){_featureManager = featureManager;}public async Task InvokeAsync(HttpContext context, RequestDelegate next){var debugEndpoint = await _featureManager.IsEnabledAsync("ForbiddenDebugEndpoint");if (debugEndpoint){context.SetEndpoint(new Endpoint((context) =>{context.Response.StatusCode = StatusCodes.Status403Forbidden;return Task.CompletedTask;},EndpointMetadataCollection.Empty,"无权访问"));}await next(context);}
}

【愚公系列】2022年03月 ASP.NET Core中间件-功能开关相关推荐

  1. 【愚公系列】2022年06月 ASP.NET Core下CellReport报表工具基本介绍和使用

    文章目录 前言 一.CellReport报表工具 1.CellReport的特点 2.CellReport的使用前提 3.CellReport的使用 4.运行和配置 前言 在没有计算机以前,人们利用纸 ...

  2. ASP.NET Core使用功能开关控制路由访问

    前言 在前面的文章,我们介绍了使用Middleware有条件地允许访问路由(<ASP.NET Core使用Middleware有条件地允许访问路由>). 而对于一些试验性的功能,我们并不希 ...

  3. ASP.NET Core使用功能开关控制路由访问(续)

    前言 在前面的文章,我们介绍了使用功能开关控制路由访问. 但其实我们使用了2个条件做的判断: var isDebugEndpoint = context.Request.Path.Value.Cont ...

  4. 【愚公系列】2022年01月 华为鸿蒙OS-03-四种模式开发实操

    文章目录 前言 一.使用JS语言开发(传统代码方式) 1.index页面源码 2.details页面源码 二.使用JS语言开发(低代码方式) 1.新建工程:注意选择 2.选择低代码新建页面 3.页面分 ...

  5. 2022年03月-电子学会青少年等级考试C语言(一级)真题与解析

    微信扫码关注公众号获取更多资讯 2022年03月软件编程(C语言)等级考试(一级) 分数:100   题数:5 时间限制:1000 ms   内存限制:65536 kB 1.双精度浮点数的输入输出 [ ...

  6. ASP.NET CORE系列【一】搭建ASP.NET CORE项目

    原文:ASP.NET CORE系列[一]搭建ASP.NET CORE项目 为什么要使用 ASP.NET Core? NET Core 刚发布的时候根据介绍就有点心里痒痒,微软的尿性都懂的,新东西bug ...

  7. ASP.NET Core 中间件(Middleware)详解

    ASP.NET Core 中间件(Middleware)详解 原文:ASP.NET Core 中间件(Middleware)详解 本文为官方文档译文,官方文档现已非机器翻译 https://docs. ...

  8. ASP.NET Core中间件初始化探究

    前言 在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,ASP.NET Core默认也为我们内置了许多的中间件,甚至有时候我们需要自定义中间件来帮我们处理一些请求管道 ...

  9. ASP.NET Core 中间件分类

    ASP.NET Core 中间件的配置方法可以分为以上三种,对应的Helper方法分别是:Run(), Use(), Map(). Run(),使用Run调用中间件的时候,会直接返回一个响应,所以后续 ...

最新文章

  1. 再译《A *路径搜索入门》之一
  2. data spring 指定时区_SpringBoot 统一时区的方案
  3. 集合框架之Map LinkedHashMap
  4. 学习threeJS(一)--第一个threeJs
  5. ios plist 国际化_Java与iOS对话:Java对象与Apple plist序列化
  6. 前端学习(2441):删除处理完成
  7. python查找序列元素的最大值和最小值_pthon基础知识(索引、切片、序列相加、乘法、检查元素是否是序列成员、计算序列长度、最大最小值)...
  8. 装水体积c语言,C语言基础之--sizeof()运算符的使用以及注意
  9. Intellij IDEA汉化教程
  10. TFTP软件测试自学,tftp 安装方法
  11. Mac如何关闭开机启动项?
  12. web播放m3u8文件且进行加密处理
  13. 二阶梯度优化新崛起,超越 Adam,Transformer 只需一半迭代量
  14. 无人机开发-介绍Mavlink协议的消息组成、如何看懂繁杂的mavlink官网介绍、简单介绍地面站与飞控的通讯流程
  15. 计算机界的“武林秘籍”——经典教材推荐
  16. 多可系统如何设置登录IP限制
  17. 研究生放假因疫情未按时返回,扣助研补贴!实验室奇葩规定引热议
  18. IDEA启动VUE项目的方法
  19. java dispo lock_java - 在Java中同步请求响应 - SO中文参考 - www.soinside.com
  20. JDO示例 - JPOX

热门文章

  1. 单片机控制W5300
  2. 为什么方差公式要用平方而不用绝对值_科学网—最小二乘法?为神马不是差的绝对值 - 于淼的博文...
  3. markdown转word (vscode插件+wps法)
  4. Python学习日记(二十二) 初识面向对象
  5. java抗锯齿_java.awt.Graphics2D抗锯齿(字体平滑)处理
  6. Kafka分布式发布订阅消息系统
  7. 敏感词(百度2017秋招真题)
  8. ㉔AW-H3 Linux驱动开发之HDMI驱动程序
  9. 21迈巴赫S480升级钢琴黑条纹桃木,奢华而不张扬
  10. solr基础理解和功能分析