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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Core使用功能开关控制路由访问(续)相关的知识,希望对你有一定的参考价值。

参考技术A

在前面的文章,我们介绍了使用功能开关控制路由访问。

但其实我们使用了2个条件做的判断:

如果仅用功能开关来控制:

这样是不是更符合功能开关的含义呢!

IFeatureFilter(功能过滤器)可用于确定是否满足某些条件以启用一项功能。

功能过滤器可以自由使用任何可用的标准,例如流程状态或请求内容。

可以为给定功能注册功能过滤器,如果任何特征过滤器评估为真,该特征将被考虑启用。

在本文,我们可以判断当前路由地址是否为调试地址,让评估返回真。

自定义功能过滤器实现代码如下:

我们注入了 IHttpContextAccessor ,用于获取当前请求上下文,然后判断当前路由地址是否包含 DebugEndpoints 配置的值。

修改我们上次实现的 DebugMiddleware :

然后将配置修改为如下形式:

运行后我们发现,只有符合功能开关设置的路由地址才会被限制访问:

如何使用 ASP.NET Core 获取当前路由名称?

【中文标题】如何使用 ASP.NET Core 获取当前路由名称?【英文标题】:How can I get the current route name with ASP.NET Core? 【发布时间】:2019-11-23 02:59:35 【问题描述】:

我有一个基于 ASP.NET Core 2.2 框架编写的应用程序。

我有以下控制器

public class TestController : Controller

    [Route("some-parameter-3/name/id:int/page:int?", Name = "SomeRoute3Name")]
    [Route("some-parameter-2/name/id:int/page:int?", Name = "SomeRoute2Name")]
    [Route("some-parameter-1/name/id:int/page:int?", Name = "SomeRoute1Name")]
    public ActionResult Act(ActVM viewModel)
    
        // switch the logic based on the route name

        return View(viewModel);
    

如何在操作和/或视图中获取路线名称?

【问题讨论】:

【参考方案1】:

对 Kirk Larkin 答案的小修正。有时您必须使用模板属性而不是名称:

var ari = ControllerContext.ActionDescriptor.AttributeRouteInfo;
var route = ari.Name ?? ari.Template;

【讨论】:

【参考方案2】:

对我来说,@krik-larkin 的回答不起作用,因为在我的情况下,AttributeRouteInfo 始终为空。

我使用了以下代码:

var endpoint = HttpContext.GetEndpoint() as RouteEndpoint;
var routeNameMetadata = endpoint?.Metadata.OfType<RouteNameMetadata>().SingleOrDefault();
var routeName = routeNameMetadata?.RouteName;

【讨论】:

在我的情况下完全一样。这应该被标记为答案。谢谢【参考方案3】:

在控制器内部,您可以从ControllerContextActionDescriptor 中读取AttributeRouteInfoAttributeRouteInfo 有一个 Name 属性,其中包含您要查找的值:

public ActionResult Act(ActVM viewModel)

    switch (ControllerContext.ActionDescriptor.AttributeRouteInfo.Name)
    
        // ...
    

    return View(viewModel);

在 Razor 视图内部,ActionDescriptor 可通过 ViewContext 属性获得:

@
    var routeName = ViewContext.ActionDescriptor.AttributeRouteInfo.Name;

【讨论】:

以上是关于ASP.NET Core使用功能开关控制路由访问(续)的主要内容,如果未能解决你的问题,请参考以下文章

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

ASP.NET Core使用功能开关控制路由访问(续)#yyds干货盘点#

在 ASP.NET Core 中更改控制器路由

ASP.NET Core使用Middleware有条件地允许访问路由

在 ASP.NET Core 3 MVC Web 应用程序中设置路由

ASP.NET Core 3.0 控制器路由不起作用