[英]Error handling in MVC
我已經為MVC中的錯誤處理苦苦掙扎了幾天。 我仍然沒有正確。 (我還在SO上閱讀了大多數問題,然后用谷歌搜索,直到手指發白為止)
我想做的事:
[Authorize]
屬性 我不想做什么:
[ErrorHandler]
放在我所有的控制器上(可以在我的基本控制器上使用)嗎? 實際上,只要我使#1-3工作,我就可以做任何必要的事情(包括NOT列表)。
我嘗試過的
Application_Error
Controller.HandleUnknownAction
Controller.OnException
[ErrorHandler]
CustomErrors
猜猜我需要這些的組合還是其他?
您還可以在Global.asax.cs
的Application_Error
中處理所有錯誤邏輯,然后根據不同的HTTP狀態代碼動態路由它們:
protected void Application_Error(object sender, EventArgs e)
{
var ex = Server.GetLastError().GetBaseException();
var routeData = new RouteData();
if (ex.GetType() == typeof(HttpException))
{
var httpException = (HttpException)ex;
switch (httpException.GetHttpCode())
{
case 401:
routeData.Values.Add("action", "NotAuthorized");
break;
case 403:
routeData.Values.Add("action", "NotAuthorized");
break;
case 404:
routeData.Values.Add("action", "PageNotFound");
break;
default:
routeData.Values.Add("action", "GeneralError");
break;
}
}
else
{
routeData.Values.Add("action", "GeneralError");
}
routeData.Values.Add("controller", "Error");
routeData.Values.Add("error", ex);
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
看來401
並沒有拋出必要的HttpException
所以您要手動處理以符合邏輯:
protected void Application_EndRequest(object sender, EventArgs e)
{
if (Context.Response.StatusCode == 401)
{
throw new HttpException(401, "You are not authorised");
}
}
是的,您的控制器繼承了基本控制器的屬性。
您可以使用自定義過濾器,只需擴展ErrorHandlerAttribute並使它知道您的錯誤控制器即可。 而不是將其添加為Application_Start
內的全局過濾器:
GlobalFilters.Filters.Add(new CustomAErrorHandlerAttribute());
正確的方法是不使用Application_Error
。 正確的方法是結合使用[HandleError]
屬性和web.config中的customErrors
部分,如下所述:
http://blog.gauffin.org/2011/11/how-to-handle-errors-in-asp-net-mvc/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.