C# MVC 全局錯誤Application_Error中處理(包括Ajax請求)

在MVC的Global.asax Application_Error 中處理全局錯誤。html

若是在未到建立請求對象時報錯,此時 Context.Handler == nullweb

判斷爲Ajax請求時,咱們返回Json對象字符串。不是Ajax請求時,轉到錯誤顯示頁面。json

/// <summary>
/// 全局錯誤
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    LogHelper.Error(ex); // 記錄錯誤日誌(NLog 挺好用的(* ̄︶ ̄))

    if (Context.Handler == null)
    {
        return;
    }

    if (new HttpRequestWrapper(Request).IsAjaxRequest())
    {
        Response.Clear();
        Response.ContentType = "application/json; charset=utf-8";
        Response.Write("{\"state\":\"0\",\"msg\":\"" + ex.Message + "\"}");
        Response.Flush();
        Response.End();
    }
    else
    {
        // 方案一 重定向到錯誤頁面,帶上簡單的錯誤信息
        //string errurl = "/Error/Error?msg=" + ex.Message;
        //Response.Redirect(errurl, true);

        // 方案二 帶上錯誤對象,轉到錯誤頁
        Response.Clear();
        RouteData routeData = new RouteData();
        routeData.Values.Add("Controller", "Error"); // 已有的錯誤控制器
        routeData.Values.Add("Action", "Error"); // 自定義的錯誤頁面

        Server.ClearError();
        ErrorController controller = new ErrorController();
        HandleErrorInfo handleErrorInfo = new HandleErrorInfo(ex, "Error", "Error");
        controller.ViewData.Model = handleErrorInfo;
        ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(((MvcApplication)sender).Context), routeData));
    }
}

其中方案二的對象用法,與默認的錯誤頁(即 /Shared/Error.cshtml)同樣。當咱們不對錯誤進行任何處理時,在web.config中可配置錯誤頁到 /Shared/Error.cshtml。app

Error.cshtml的代碼:url

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = "系統錯誤";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h3 class="text-danger">系統錯誤</h3>
@if (Model != null)
{
    <span class="text-warning">@(Model.Exception.Message)</span>
}
else
{
    <span class="text-warning">處理請求時出錯。</span>
}

方案二的Action的代碼:spa

public ActionResult Error()
{
    return View();
}

相關配置影響:日誌

<!--開啓會致使異常不走Application_Error,直接尋Error-->
<!--<customErrors mode="On" defaultRedirect="~/Error.cshtml" />-->
相關文章
相關標籤/搜索