Asp.net mvc StackTrace.GetFrame的替代方案。。。在调用方法的控制器上查找操作 设置:
我编写了一个ASP.NET MVC向导,它最初基于Steve Sanderson的向导(Pro ASP.NET MVC 2框架)。我的向导是通用的,是一个梦想 每个向导步骤都是一个操作 但是,我现在发布了一个广泛使用向导的应用程序。显然,该应用程序处于发布模式 WizardController类是所有向导的基类。它有一个OnActionExecuting方法,我怀疑它可以为我的问题提供解决方案。问题是如何,或者更确切地说,以正确的顺序遍历堆栈,问题是什么 问题是: 深入到WizardController中的代码使用:Asp.net mvc StackTrace.GetFrame的替代方案。。。在调用方法的控制器上查找操作 设置:,asp.net-mvc,stack-trace,onactionexecuting,Asp.net Mvc,Stack Trace,Onactionexecuting,我编写了一个ASP.NET MVC向导,它最初基于Steve Sanderson的向导(Pro ASP.NET MVC 2框架)。我的向导是通用的,是一个梦想 每个向导步骤都是一个操作 但是,我现在发布了一个广泛使用向导的应用程序。显然,该应用程序处于发布模式 WizardController类是所有向导的基类。它有一个OnActionExecuting方法,我怀疑它可以为我的问题提供解决方案。问题是如何,或者更确切地说,以正确的顺序遍历堆栈,问题是什么 问题是: 深入到WizardContro
var stackTrace = new StackTrace();
string actionName = stackTrace.GetFrame(n).GetMethod().Name
获取调用此代码的操作的名称(其中n是我知道的帧,是调试模式下的调用操作…)。这允许我确定正在执行的向导步骤/操作
这在调试模式下运行良好,但在发布模式下,编译器会优化我的代码。因此,n可能表示,也可能不表示堆栈中的正确帧
实际情况是,在释放模式下,有时n并不代表正确的帧。有时还不够好。有时候是我的问题。我想要一个防弹的解决方案
问题:
那么,除了使用stacktrace,还有什么替代方法呢??我怀疑我可以使用OnActionExecuting方法获取操作的名称,这正是我所需要的,因为这个名称标识了向导中的步骤
但是怎么做呢
忘记生存还是不生存。怎么用?这就是问题所在。好吧,写这篇文章让我意识到答案正盯着我的脸 OnActionExecuting方法的ActionExecutionContext参数为我提供了操作名称所需的句柄,如下所示: 在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可能在调试模式下已知,但在发布模式下肯定不知道
呸
希望这能帮助像Narcissus一样落入反思陷阱的其他人