Альтернатива 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, чтобы получить имя действия, которое мне и нужно, так как это имя определяет шаг в моем мастере.

Но как?

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

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 может быть известно в режиме отладки, но точно не известно наверняка в режиме выпуска.

Уф!

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

Другие вопросы по тегам