Передача динамической переменной в фильтр пользовательских действий из метода HTTPGET контроллера

У меня есть приложение MVC, в котором контроллер A вызывает внутренний метод HTTPGET (обрабатывается контроллером B). У A есть вид, а у B нет.

HTTPGET в контроллере B выглядит так:

[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
    }
}

person divyanshm    schedule 20.08.2013    source источник
comment
@PKKG - я не хотел использовать ViewBag, он не подходит для архитектуры. Контроллер, о котором я говорю, не имеет представления. И для вашего второго метода это хорошо только для констант. Вы не можете передавать динамические переменные таким образом.   -  person divyanshm    schedule 24.08.2013
comment
@divyanshm: Как насчет этого   -  person Imad Alazani    schedule 27.08.2013


Ответы (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
    }
}
person Oliver    schedule 22.08.2013

Лучшим способом было бы зарегистрировать QueryString и другие элементы, как это было предложено другими ответами, однако, если вы хотите получить доступ только к параметрам метода, вы можете сделать это, как показано ниже, словарь параметров действия предоставит вам все параметры метода.

public class MyActionFilterAttribute : ActionFilterAttribute {
    public override void OnActionExecuted
       (HttpActionExecutedContext filterContext) {
        foreach (KeyValuePair<string,object> item 
            in filterContext.ActionParameters)
        {
            //print item.Key
            //print item.Value
        }
    }
}
person Akash Kava    schedule 27.08.2013
comment
Спасибо, Акаш. Я рассматривал вариант строки запроса, но мне пришлось отправить строку запроса + другие параметры. Вот почему я использовал подход, который я упомянул. Я тоже попробую. - person divyanshm; 28.08.2013

Я решил эту проблему, сделав необходимые параметры общедоступными в контроллере и прочитав параметры напрямую как 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
    }
person divyanshm    schedule 23.08.2013
comment
Bounty по-прежнему доступен для лучшего ответа! - person divyanshm; 23.08.2013