Альтернатива StackTrace.GetFrame для поиска действия на контроллере, который вызвал метод

Настраивать:

Я написал мастер ASP.NET MVC, изначально основанный на мастере Стива Сандерсона (Pro ASP.NET MVC 2 Framework). Мой волшебник универсален и является мечтой.

Каждый шаг мастера - это действие.

Однако теперь я выпустил приложение, которое широко использует мастер. Очевидно, что приложение находится в режиме выпуска.

Класс WizardController ‹> - это базовый класс для всех моих мастеров. В нем есть метод OnActionExecuting, который, как я подозреваю, может решить мою проблему. Вопрос в том, как, а точнее пройти по стеку в нужном порядке, в чем проблема ...

Эта проблема:

Код в глубине WizardController использует:

var stackTrace = new StackTrace();
string actionName = stackTrace.GetFrame(n).GetMethod().Name

чтобы получить имя действия, которое вызвало этот код (где n - это кадр, который, как я знаю, является вызывающим действием ... то есть в режиме отладки). Это позволяет мне определить, на каком шаге / действии мастера я выполняю.

Это отлично работает в режиме отладки, но в режиме выпуска компилятор оптимизирует мой код. Таким образом, n может или не может представлять правильный фрейм в моем стеке.

Реальность такова, что в режиме выпуска иногда n не соответствует правильному кадру. А иногда бывает недостаточно. Иногда это моя проблема. Я хочу пуленепробиваемое решение.

Вопрос:

Так какая альтернатива использованию stacktrace ?? Я подозреваю, что могу использовать свой метод OnActionExecuting, чтобы получить имя действия, что мне и нужно, поскольку это имя определяет шаг в моем мастере.

Но как?

Забудьте быть или не быть. Как? Вот в чем вопрос.


person awrigley    schedule 21.02.2013    source источник


Ответы (1)


Хорошо, написание сообщения заставило меня понять, что ответ смотрел на меня посинее.

Параметр ActionExecutingContext метода OnActionExecuting дает мне нужный дескриптор имени действия, как показано ниже:

В моем классе WizardController я добавляю следующее:

private string ActionName { get; set; } 
protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ActionName = filterContext.ActionDescriptor.ActionName; 
    // All the other stuff...
}

Теперь я могу использовать свойство ActionName вместо:

stackTrace.GetFrame(n).GetMethod().Name

где n может быть известно в режиме отладки, но точно не известно в режиме выпуска.

Уф!

Надеюсь, это поможет кому-то еще, кто, как Нарцисс, попал в ловушку отражения.

person awrigley    schedule 21.02.2013