我有一个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
}
}
答案 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
}