[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”放在我查找的数据库表中。
我试图在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;
}
对不起,对你们两个人来说可能为时已晚,但名字可以在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;
}
}
}