2011-02-07 73 views
2

我从像这样我的global.ascx文件调用一个ActionResult ...发送堆栈跟踪信息在查询字符串

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

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

+0

你可以把它放在tempdata中吗?通常我只是记录异常并使用日志来调试 – 2011-02-07 21:56:08

+0

@Phil,`TempData`和重定向来处理异常? 302状态码而不是500?不感觉非常RESTful或SEO友好。 – 2011-02-07 22:02:53

回答

5

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

如果你想复杂的对象不重定向。设置适当的状态代码和转让这是更为REST风格和搜索引擎友好:

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 
    } 
} 

如果你重定向你不能发送复杂的对象。

0

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

TempData["myException"] = exception; 

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

+0

`TempData`和重定向来处理异常? 302状态码而不是500?不感觉非常RESTful或SEO友好。 – 2011-02-07 22:03:38