Web Api获取路线中的名称

时间:2017-04-19 20:05:52

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

[HttpGet]
[Route("api/CheckMainVerified/{mainid}", Name = "CheckMainVerified")]
public IHttpActionResult CheckIfVerified(int mainid)

所以我发现属性

上有 Name 属性

但我不知道如何访问它。

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

    api/CheckMainVerified/
    CheckMainVerified

我无法用{whatever}

了解它

因为 api / CheckMainVerified / {mainid} 确实最终出现在示例的传入网址中

          .../api/CheckMainVerified/32342343   

由于URLS的变化可能很多,因此用值来检查所有参数是一件噩梦

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

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

3 个答案:

答案 0 :(得分:0)

我试图在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;
}

答案 1 :(得分:0)

对不起,可能对你们俩来说都太迟了,但是名称可以在HttpActionContext ActionDescriptor ActionName属性中找到。您可以创建一个继承自ActionFilterAttribute的新过滤器并获取名称。控制器名称是基本控制器(如果控制器名称为CustomerController,则为控制器的所有内容,例如,客户),而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;
        }
    }
}

答案 2 :(得分:0)

基于 @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();