Web Api获取路径中的名称

问题描述 投票:0回答:2
[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   

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

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

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

c# asp.net-web-api asp.net-web-api2 asp.net-web-api-routing
2个回答
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;
}

0
投票

对不起,对你们两个人来说可能为时已晚,但名字可以在HttpActionContext ActionDescriptor ActionName属性中找到。您可以创建一个继承自ActionFilterAttribute的新过滤器并获取名称。控制器名称是基本控制器(一切由Controller控制,例如,如果控制器名称为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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.