簡體   English   中英

MVC中的錯誤處理

[英]Error handling in MVC

我已經為MVC中的錯誤處理苦苦掙扎了幾天。 我仍然沒有正確。 (我還在SO上閱讀了大多數問題,然后用谷歌搜索,直到手指發白為止)

我想做的事:

  1. 使用標准的[Authorize]屬性
  2. 將所有錯誤重定向到我的錯誤控制器(包括未授權者)
  3. 在我的錯誤控制器中,每個HTTP錯誤都有一個操作。

我不想做什么:

  1. [ErrorHandler]放在我所有的控制器上(可以在我的基本控制器上使用)嗎?
  2. 使用自定義的Authorize屬性。

實際上,只要我使#1-3工作,我就可以做任何必要的事情(包括NOT列表)。

我嘗試過的

  1. 使用Application_Error
  2. 使用Controller.HandleUnknownAction
  3. 使用Controller.OnException
  4. 在我的控制器上使用[ErrorHandler]
  5. 在web.config中打開/關閉CustomErrors

猜猜我需要這些的組合還是其他?

您還可以在Global.asax.csApplication_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM