在queryString上发送堆栈跟踪信息

时间:2011-02-07 21:47:43

标签: asp.net-mvc

我从我的global.ascx文件调用actionResult就像这样...

 Response.Redirect(String.Format("~/Error/{0}/?message={1}", action, exception.Message));

我想要做的是在动作结果方法中提供整个异常对象,这样我就可以在我的页面上获取并显示堆栈跟踪信息....是否可以传递整个异常对象?处理这个问题的最佳方法是什么?或者是否有工作来获得正确的堆栈跟踪信息?目前,它是在异常对象上正确填充的属性。

2 个答案:

答案 0 :(得分:5)

如果您重定向,则无法发送复杂对象。我的意思是你可以使用SessionTempData(在幕后使用Session),但它很丑陋,我建议反对。

如果您希望复杂对象不重定向。设置正确的状态代码和转移,这更加RESTful和SEO友好:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Response.Clear();
    Context.ClearError();
    var routeData = new RouteData();
    routeData.Values["controller"] = "error";
    routeData.Values["action"] = "Http500";
    routeData.Values["exception"] = exception;
    IController errorController = new ErrorController();
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

其中ErrorController如下所示:

public class ErrorController : Controller
{
    public ActionResult Http500(Exception exception)
    {
        Response.StatusCode = 500;
        // TODO: do something with the exception like logging it 
        // and render some view explaining the annoyed user 
        // that something very wrong happened to your application 
        // which wasn't your fault of course or something
    }
}

如果您重定向,则无法发送复杂对象。

答案 1 :(得分:0)

更好的方法是使用TempData集合。

TempData["myException"] = exception;

它仅作为下一个请求的数据存储(当然对于当前客户端)。但是,我相信它只能在Controller中访问,因此您可能需要重新组织代码,以便在控制器中进行错误处理(我有一些我现在无法访问的示例代码,但会放很快就会更好地解释这一点。