我很努力去理解如何正確處理ASP.NET MVC4中的錯誤。舉個例子,我創建使用「互聯網應用」模板創建一個新MVC4項目,並更新了我的家庭控制器來測試一些錯誤情況:404,401和其他異常的ASP.NET MVC4錯誤處理
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Hello";
return View();
}
public ActionResult About()
{
throw new HttpException(401, "Not Authorized");
}
public ActionResult Contact()
{
throw new Exception("Oh no, some error occurred...");
}
}
我在我的web.config文件中啓用的customErrors:
<customErrors mode="On"></customErrors>
當我運行應用程序,然後單擊「聯繫人」,我看到了〜/查看/共享/ Error.cshtml視圖如預期,因爲我有註冊爲一個全球性的過濾器的HandleErrorAttribute
。
但是,當我點擊「關於」,我得到標準的ASP.NET黃色錯誤頁面,說「運行時錯誤」。 爲什麼這兩個例外的處理方式不同,如何使用HandleError
屬性獲取HttpException
的實例?
的customErrors配置
理想情況下,我想以下的自定義錯誤頁:
- 自定義的404(未找到)頁面這是很好的和用戶友好的
- 自定義401(未授權)頁面,通知用戶他們無權訪問(例如,在檢查模型中特定項目的權限後拋出)
- 在所有其他情況下(代替標準的黃色ASP.NET頁面)使用的通用錯誤頁面。
我已經創建了一個新的「Error」控制器,其中包含以上每個場景的視圖。然後,我已經更新在web.config中的customErrors像這樣:
<customErrors mode="On" defaultRedirect="~/Error/Trouble">
<error statusCode="404" redirect="~/Error/NotFound"></error>
<error statusCode="401" redirect="~/Error/NotAuthorized"></error>
</customErrors>
404頁工作正常,但我完全不拿到401頁。相反,當我嘗試訪問Home
控制器上的About
操作時,我看到〜/錯誤/故障視圖(指定爲defaultRedirect
的那個視圖)。
爲什麼我的自定義401重定向頁面不工作?
這是一個偉大的(並且非常簡單)解決方案,謝謝! 爲了讀者閱讀這個問題的其他人的興趣,這裏是另一個很好的評論,描述了401和403之間的區別:http://stackoverflow.com/a/6937030/1145963 –