Альтернатива 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 может быть известно в режиме отладки, но точно не известно наверняка в режиме выпуска.
Уф!
Надеюсь, что это поможет кому-то еще, кто, как Нарцисс, попал в ловушку отражения.