如何找到发生错误的控制器/动作?
Posted
技术标签:
【中文标题】如何找到发生错误的控制器/动作?【英文标题】:How to find in which controller/action an error occurred? 【发布时间】:2011-02-15 18:02:33 【问题描述】:我正在记录 OnException 方法中发生的所有错误。
【问题讨论】:
ExceptionContext不包含你想要的数据吗? 【参考方案1】:正如 Charlino 所暗示的,这些值可从 ExceptionContext 参数中获得:
protected override void OnException(ExceptionContext filterContext)
var controllerName = filterContext.RouteData.Values["controller"];
var actionName = filterContext.RouteData.Values["action"];
// ...
base.OnException(filterContext);
【讨论】:
【参考方案2】:检查异常的调用堆栈。
例如:
var actionMethod = new StackTrace(exception)
.GetFrames().FirstOrDefault(f =>
typeof(IController).IsAssignableFrom(f.GetMethod().DeclaringType)
).GetMethod();
【讨论】:
不要这样做;根据下面 OdeToCode 的回答,ExceptionContext 提供了一种更简单、更简洁、更有效的方式来访问控制器名称和操作。 @ChristopherKing:只要你有可用的上下文。 我相信他会这样做,根据他正在处理 OnException 方法中的错误的声明。 在这种特殊情况下(可用上下文),这可能不是最有效的方法,但它为接受的答案增加了一个价值,显示了另一种方法。我不会投赞成票,但我也不会投反对票。【参考方案3】:在你的 global.asax 中添加以下方法并在其上放置一个断点
public void Application_Error(object sender, EventArgs e)
无论在应用程序的哪个位置发生错误,都会命中该方法的断点。从这里您可以在快速监视窗口中看到以下表达式的值,您将知道发生异常的确切原因是什么
((System.Web.HttpApplication)(sender)).Context.AllErrors
无论您的 Web 应用程序中发生异常的位置,此方法都会有所帮助。
【讨论】:
问题表明控制器的 OnException 处理程序正在被使用,所以这不是回答问题。 所以 Application_Error 也可以有两个参数!以上是关于如何找到发生错误的控制器/动作?的主要内容,如果未能解决你的问题,请参考以下文章