在onactionexecution的Web API调用-如何映射到控制器/动作类从路由字符串读取动作属性

本文关键字:动作类 控制器 路由 字符串 属性 读取 映射 API Web onactionexecution 调用 | 更新日期: 2023-09-27 18:03:53

如何将传入路由字符串(例如Products/GetProduct)映射到将被调用的控制器/方法(ProductsController, GetProduct方法)?

我的目标是检查productscontroller的一个实例,以查找放置在GetProduct方法上的自定义属性。

一旦我知道我要处理的是哪个类/方法,我就知道如何检查这个类。

我曾经考虑过分割字符串,所以你最终会得到"产品"answers"GetProducts",然后我可以寻找一个ProductsController,并在其中,一个名为GetProducts的方法。

这可能有效,但似乎应该有一个更好的解决方案。什么好主意吗?

在onactionexecution的Web API调用-如何映射到控制器/动作类从路由字符串读取动作属性

您可以使用以下命令获取实际的控制器实例和操作的属性:

public class Somefilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var controller = actionContext.ControllerContext.Controller;
            var someFilterattributes = actionContext.ActionDescriptor.GetCustomAttributes<Somefilter>()
            var otherAttributes = actionContext.ActionDescriptor.GetCustomAttributes<Other>()
        }
    }

其中Other是操作上的其他过滤器

您可以通过在 onactionexecution 方法

中使用以下代码来获取控制器名称
var controller = actionContext.Request.GetRouteData().Values["controller"];

在Web API中获取控制器名称和操作:

Public Class MyClassActionFilter
    Inherits ActionFilterAttribute
    Public Overrides Sub OnActionExecuted(contexto As HttpActionExecutedContext)
        contexto.Request.Properties.Item("MS_HttpRouteData").Values("controller")
        contexto.Request.Properties.Item("MS_HttpRouteData").Values("action")
    End Sub
    Public Sub New
    End Sub
End Class

WebApiConfig.vb中添加一个全局过滤器,这样你就不需要在所有方法的头中添加标签

GlobalConfiguration.Configuration.Filters.Add(New MyClassActionFilter())