【问题标题】:Web Api get the Name in the RouteWeb Api 获取路由中的名称
【发布时间】:2017-09-16 05:43:37
【问题描述】:
[HttpGet]
[Route("api/CheckMainVerified/{mainid}", Name = "CheckMainVerified")]
public IHttpActionResult CheckIfVerified(int mainid)

所以我发现属性上有一个Name属性

但我不知道如何访问它。

我希望能够检查是否有人可以访问带有令牌等的数据库表中存储的 api。所以我不在乎它是否是以下任何一种

    api/CheckMainVerified/
    CheckMainVerified

我无法通过 {whatever} 了解它

因为这个 api/CheckMainVerified/{mainid} 最终会出现在示例的传入 URL 中

          .../api/CheckMainVerified/32342343   

由于 URL 可能有如此多的变体,因此检查所有带有值的参数将是一场噩梦

          /api/books/45/outlets/3/sections/abc/location/9

所以理想情况下,我希望能够只查看“名称”,然后将“CheckMainVerified”放在我查找的数据库表中。

【问题讨论】:

标签: c# asp.net-web-api asp.net-web-api2 asp.net-web-api-routing


【解决方案1】:

我尝试在 ActionFilter 中获取自定义日志的路由名称,几小时后我成功了。

我已经覆盖了 ActionAttribute 类中的 OnActionExecuted,它公开了一个 HttpActionExecutedContext 对象,然后可以从执行的操作中访问自定义属性。

我以这样的方式结束

private string TryGetRouteName(HttpActionExecutedContext ctx)
{
  var route = ctx.ActionContext.RequestContext.RouteData.Route;

  if (route.DataTokens.TryGetValue("actions", out object value) && value != null)
  {
    var actions = (HttpActionDescriptor[])value;
    var executedAction = actions.FirstOrDefault();
    var routeAttributes = executedAction?.GetCustomAttributes<RouteAttribute>(true) ?? new Collection<RouteAttribute>();

    return routeAttributes.FirstOrDefault()?.Name ?? string.Empty;
  }

  return string.Empty;
}

【讨论】:

  • 这行得通。它返回方法上的第一个 Route 属性,如果存在多个 Route 属性,则不是实际执行的路由。
  • 如果您不使用基于约定的路由,这可行。
【解决方案2】:

抱歉,对你们俩来说可能为时已晚,但名称可在 HttpActionContext ActionDescriptor ActionName 属性中找到。您可以创建一个继承自 ActionFilterAttribute 的新过滤器并获取名称。控制器名称是基本控制器(直到控制器的所有内容,例如,如果控制器名称是 CustomerController,则为 Customer),methodName 是实际路由(例如,GetCustomer)。在这些领域中还有大量其他有趣的信息。

using System.Web.Http.Controllers;
using System.Web.Http.Filters;

namespace WebApplication1.Filters
{
    public class ServiceCallAuthorization : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var serviceName = actionContext.ControllerContext.ControllerDescriptor.ControllerName;
            var methodName = actionContext.ActionDescriptor.ActionName;
        }
    }
}

【讨论】:

    【解决方案3】:

    基于 @awquadro 的工作,这里有一个扩展方法:

    public static string GetRouteName (this HttpActionContext ctx)
            {
                var route = ctx.RequestContext.RouteData.Route;
    
                if (route.DataTokens.TryGetValue("actions", out object value) && value != null)
                {
                    var actions = (HttpActionDescriptor[])value;
                    var executedAction = actions.FirstOrDefault();
                    var routeAttributes = executedAction?.GetCustomAttributes<RouteAttribute>(true) ?? null;
    
                    return routeAttributes.Where(x=> ctx.ControllerContext.RouteData.Route.RouteTemplate.EndsWith(x.Template)).FirstOrDefault().Name;
                }
    
                return string.Empty;
            }
    

    这可以称为:

     String routeName = ActionContext.GetRouteName();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-10
      • 2013-05-07
      • 1970-01-01
      • 2018-04-30
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      相关资源
      最近更新 更多