我創建了一個ASP.NET MVC 3應用程序,使用httpErrors
來處理向用戶顯示錯誤消息等。該代碼工作正常,並在下面重複。使用IIS7將異常傳遞到自定義錯誤頁面httpErrors
<httpErrors existingResponse="Replace" defaultResponseMode="ExecuteURL" errorMode="Custom">
<clear/>
<error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL"/>
<error statusCode="404" subStatusCode="-1" path="/Error/NotFound" responseMode="ExecuteURL"/>
<error statusCode="500" subStatusCode="-1" path="/Error/ServerError" responseMode="ExecuteURL"/>
</httpErrors>
當一個控制器發生異常時,BaseController.OnException
被觸發(BaseController
是一類我自己創造的)。我想在該函數中執行的操作是存儲異常,以便ServerError操作可以查看其類型和消息以確定向用戶顯示的內容。整個方法複製如下。
protected override void OnException(ExceptionContext filterContext)
{
// doesn't work
this.TempData["exception"] = filterContext.Exception;
// doesn't work
this.Session["exception"] = filterContext.Exception;
// temporary hack
ErrorController.RequestExceptions[this.Request.UserHostAddress] = filterContext.Exception;
base.OnException(filterContext);
}
當請求到達ErrorController
實例(ErrorController
是在不同的命名空間,但我不認爲這是相關的),由於某種原因,Server.GetLastError()
返回null,TempData的是空的,會議是空的,Session.IsNewSession
是真的。我嘗試通過讓應用存儲某種請求ID來解決這個問題,但這似乎並不存在,現在我得到的最佳解決方案就是這種非常冒險的「通過請求IP來存儲它,然後刪除只要ErrorController已經把它拿起來了。「
這(令人驚訝)的作品,但必須有一個更安全和更具擴展性的解決方案。我不確定爲什麼TempData被清除或爲什麼會話重新啓動 - 是因爲錯誤,還是這算作兩個單獨的請求?無論如何,是否有解決方法來獲得所需的行爲?
P.S.如果可能的話,我寧願使用web.config中的httpErrors
條目,而不是Application_Error中的代碼:它看起來像一個更清晰,更具說明性的解決方案。
P.P.S.我在重定向期間發現了一篇關於Session對象問題的文章(link),但它表示問題已得到解決。我遇到過的其他大部分事情都是關於舊的customErrors
系統,但我會繼續尋找。
上爲什麼會被清除任何消息。我有完全相同的問題。坦克 – 2013-07-31 11:06:46