前言 在前面的文章,我们介绍了使用功能开关控制路由访问。 但其实我们使用了2个条件做的判断:varisDebugEndpointcontext。Request。Path。Value。Contains(test);vardebugEndpointawaitfeatureManager。IsEnabledAsync(ForbiddenDebugEndpoint);if(isDebugEndpointdebugEndpoint) 如果仅用功能开关来控制:vardebugEndpointawaitfeatureManager。IsEnabledAsync(ForbiddenDebugEndpoint);if(debugEndpoint) 这样是不是更符合功能开关的含义呢!IFeatureFilter介绍 IFeatureFilter(功能过滤器)可用于确定是否满足某些条件以启用一项功能。 功能过滤器可以自由使用任何可用的标准,例如流程状态或请求内容。 可以为给定功能注册功能过滤器,如果任何特征过滤器评估为真,该特征将被考虑启用。 在本文,我们可以判断当前路由地址是否为调试地址,让评估返回真。实现 自定义功能过滤器实现代码如下:publicclassDebugFeatureSettings{publicstring〔〕DebugEndpoints{get;set;}}〔FilterAlias(DebugFeatureFilter)〕publicclassDebugFeatureFilter:IFeatureFilter{privatereadonlyIHttpContextAccessorhttpContextAccessor;publicDebugFeatureFilter(IHttpContextAccessorhttpContextAccessor){httpContextAccessorhttpContextAccessor;}publicTaskboolEvaluateAsync(FeatureFilterEvaluationContextcontext){varsettingscontext。Parameters。GetDebugFeatureSettings();foreach(varendPointinsettings。DebugEndpoints){varisDebugEndpointhttpContextAccessor。HttpContext。Request。Path。Value。Contains(endPoint);returnTask。FromResult(isDebugEndpoint);}returnTask。FromResult(false);}} 我们注入了IHttpContextAccessor,用于获取当前请求上下文,然后判断当前路由地址是否包含DebugEndpoints配置的值。使用 修改我们上次实现的DebugMiddleware:publicclassDebugMiddleware:IMiddleware{privatereadonlyIFeatureManagerfeatureManager;publicDebugMiddleware(IFeatureManagerfeatureManager){featureManagerfeatureManager;}publicasyncTaskInvokeAsync(HttpContextcontext,RequestDelegatenext){vardebugEndpointawaitfeatureManager。IsEnabledAsync(ForbiddenDebugEndpoint);if(debugEndpoint){context。SetEndpoint(newEndpoint((context){context。Response。StatusCodeStatusCodes。Status403Forbidden;returnTask。CompletedTask;},EndpointMetadataCollection。Empty,无权访问));}awaitnext(context);}} 然后将配置修改为如下形式:FeatureManagement:{ForbiddenDebugEndpoint:{EnabledFor:〔{Name:DebugFeatureFilter,Parameters:{DebugEndpoints:〔test〕}}〕}}结论 运行后我们发现,只有符合功能开关设置的路由地址才会被限制访问: