2011-02-07 78 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