【问题标题】:Get executing action in HttpModule在 HttpModule 中获取执行动作
【发布时间】:2013-03-30 09:15:25
【问题描述】:

我有一个 HttpModule,需要知道正在执行的操作。而且我需要从方法中获取MethodInfo,动作名不够,需要从类型中获取真正的方法。

我知道如何获取控制器和动作:

string controllerName = ...RouteData.Values["controller"].ToString();
string actionName = ...RouteData.Values["action"].ToString();

我想做:
controllerType.GetMethod(actionName)

这当然会导致 AmbiguousMatchException...

正在执行哪个签名?有可能知道吗?

【问题讨论】:

  • 您使用的是什么版本的 .NET?在 4.0 及更高版本中,路由内置于 ASP.NET(不仅仅是 MVC)中,因此在您的模块中您可以使用 HttpContext.Current.Request.RequestContext.RouteData,并从那里获取操作值。要确定正在执行的方法,您将使用其余的路由数据,即任何不是控制器、操作或区域的数据,因为这些将与您的操作方法上的参数匹配。
  • 我正在使用 HttpContext.Current.Request.RequestContext.RouteData。但我无法为动作获得正确的过载?你知道怎么做吗?
  • 查看我的建议答案。

标签: asp.net-mvc


【解决方案1】:

这应该可行。它循环遍历路由数据并获取所有不为人知的路由数据,即控制器、动作和区域。这是假设您使用的是默认路由。路由的每个其他部分,无论是在 URL 中还是在查询字符串中,都将映射到方法参数。您可以获取这些路由值的类型并使用它们来获取指定的方法信息。

List<Type> methodParams = new List<Type>();
string action = HttpContext.Current.Request.RequestContext.RouteData["action"];
foreach (var data in HttpContext.Current.Request.RequestContext.RouteData.Values)
{
    if ((data.Key != "action") && (data.Key != "controller") && (data.Key != "area"))
        methodParams.Add(data.Value.GetType());                
}

Type t; //assume this is your type that implements the action method you're interested in.  
        //I'm assuming you know it somehow

MethodInfo info = t.GetMethod(action, methodParams.ToArray());

【讨论】:

  • 我已经尝试过了,但我只在 RouteData、控制器、操作和 ID 中获得了 3 个键。并且事件虽然动作有 2 个参数,但我在 RouteData 中找不到它们。
  • 是否存在多个同名但参数不同的操作方法?您的操作方法签名和 URL 是什么样的?
  • 示例:1:[AcceptVerbs(HttpVerbs.Get)] public ActionResult Report() 2:[AcceptVerbs(HttpVerbs.Post)] public virtual JsonResult Report(ViewModel viewModel)
  • 你能发布一个示例网址吗?
  • 如果这是您的 URL,那么仅 URL 本身就无法帮助您确定正在访问的操作方法。我假设(错误地)您有更多以查询字符串等形式存在的路由数据,因此您现在可以轻松获得操作。您的所有操作都只是 HTTP Get 与 Http Post 的区别吗?如果是这样,那么您可以使用 Request.HttpMethod 来获取 HttpMethod,并使用反射来查看与您的操作名称匹配的所有方法的属性,并根据它是否使用 HttpGet 或 HttpPost 属性进行装饰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2020-05-09
相关资源
最近更新 更多