[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”放在我查找的数据库表中。
答案 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();