StackTrace.GetFrame的替代方法...在调用方法的控制器上查找操作

时间:2013-02-21 18:42:58

标签: asp.net-mvc stack-trace onactionexecuting

设定:

我编写了一个ASP.NET MVC向导,最初基于Steve Sanderson的向导(Pro ASP.NET MVC 2 Framework)。我的巫师是通用的,是一个梦想。

每个向导步骤都是一个动作。

但是,我现在已经发布了一个广泛使用该向导的应用程序。显然,应用程序处于发布模式。

WizardController<> class是我所有向导的基类。它有一个OnActionExecuting方法,我怀疑可以为我的问题提供解决方案。问题是如何或者更确切地说,以正确的顺序遍历堆栈,问题是什么......

问题:

WizardController深处的代码使用:

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

获取调用此代码的操作的名称(其中n是我知道的框架是调用模式中的调用操作...)。这允许我确定我所在的向导步骤/动作。

这在调试模式下工作正常,但在发布模式下,编译器会优化我的代码。因此,n可能或可能不代表我的堆栈中的正确帧。

现实情况是,在发布模式下,有时n不代表正确的框架。有时候还不够好。有时是我的问题。我想要一个防弹解决方案。

问题:

那么使用stacktrace有什么替代方案?我怀疑我可以使用我的OnActionExecuting方法来获取操作的名称,这就是我需要的,因为这个名称标识了我向导中的步骤。

但是怎么样?

忘记成为或不成为。怎么样?这是个问题。

1 个答案:

答案 0 :(得分:0)

好吧,写这篇文章让我意识到答案是盯着我脸上的蓝色。

OnActionExecuting方法的ActionExecutingContext参数为我提供了Action名称所需的句柄,如下所示:

在我的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一样陷入反思陷阱的其他人。