将动态变量从控制器的HTTPGET方法传递给自定义操作过滤器

时间:2013-08-20 05:34:25

标签: asp.net .net asp.net-mvc-4 action-filter custom-action-filter

我有一个MVC应用程序,其中控制器A调用内部HTTPGET方法(由控制器B处理)。 A有视图,B没有。

控制器B中的HTTPGET如下所示:

[HttpGet]
public String GetToken(string accessToken, string UID)  {
    ....
    // Log errors and other metrics
    return someToken;
}

我想在我的B控制器上使用动作过滤器,它为我做错误记录。我确实需要在记录时通过HTTP GET传递的参数。如何将accessToken和UID传递给动作过滤器,以便我可以记录它。

我正在寻找的是这样的: 控制器应该像

[MyActionFilter]
[HttpGet]
public String GetToken(string accessToken, string UID)  {
        ....
        return someToken;
    }

而动作过滤器应该进行记录

public class MyActionFilterAttribute : ActionFilterAttribute {
    public override void onActionExecuted(HttpActionExecutedContext actionExecutedContext) {
        // READ THE HTTP GET PARAMETERS AND DO THE LOGGING
    }
}

3 个答案:

答案 0 :(得分:3)

您可以使用:

public class MyActionFilterAttribute : ActionFilterAttribute {
    public override void onActionExecuted(
                                  ActionExecutedContext actionExecutedContext) {
        // READ THE HTTP GET PARAMETERS AND DO THE LOGGING
        actionExecutedContext.HttpContext.Request.QueryString; // HTTP GET 
       actionExecutedContext.HttpContext.Request.Params; 
       // HTTP GET / POST / COOKIE PARAMETERS As Key Value List
    }
}

答案 1 :(得分:1)

最好的方法是Log QueryString和其他项目,如其他答案所示, 但是,如果您只想访问方法参数,那么您可以这样做 如下所示,ActionParameters Dictionary将为您提供所有方法参数。

public class MyActionFilterAttribute : ActionFilterAttribute {
    public override void OnActionExecuted
       (HttpActionExecutedContext filterContext) {
        foreach (KeyValuePair<string,object> item 
            in filterContext.ActionParameters)
        {
            //print item.Key
            //print item.Value
        }
    }
}

答案 2 :(得分:-1)

我通过在控制器中公开所需参数并将参数直接读为filterContext.Controller.publicParam来解决这个问题。

ActionFilter现在看起来像这样 -

public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var thisController = ((myController)filterContext.Controller);

        // public function in the controller that returns the required object
        RequiredParameters requiredParams = 
                                    thisController.getParametersForLogging( );

        // read the variables from requiredParams object and do the logging
    }