ASP.NET MVC 全局異常

来源:https://www.cnblogs.com/Wtomato/archive/2018/08/31/9564092.html
-Advertisement-
Play Games

先新建一個過濾器ExceptionHandleErrorAttribute.cs 內容如下: 1 using System; 2 using System.Net; 3 using System.Web; 4 using System.Web.Mvc; 5 using ABBPMP.Utility. ...


先新建一個過濾器ExceptionHandleErrorAttribute.cs

內容如下:

 1 using System;
 2 using System.Net;
 3 using System.Web;
 4 using System.Web.Mvc;
 5 using ABBPMP.Utility.NLogHelper.Static;
 6 
 7 namespace ABBPMP.Filter
 8 {
 9     /// <summary>
10     /// 異常捕獲(業務邏輯層,UI層)
11     /// </summary>
12     public class ExceptionHandleErrorAttribute : HandleErrorAttribute
13     {
14         /// <summary>
15         /// 錯誤攔截
16         /// </summary>
17         /// <param name="filterContext"></param>
18         public override void OnException(ExceptionContext filterContext)
19         {
20 
21             if (filterContext.ExceptionHandled)
22             {
23                 return;
24             }
25 
26 
27 
28             string message =
29                 $"消息類型:{filterContext.Exception.GetType().Name}\r\n消息內容:{filterContext.Exception.Message}\r\n引發異常的方法:{filterContext.Exception.TargetSite}\r\n引發異常的對象:{filterContext.Exception.Source}\r\n異常目錄:{filterContext.RouteData.GetRequiredString("controller")}\r\n異常方法:{filterContext.RouteData.GetRequiredString("action")}\r\n錯誤詳細記錄:{filterContext.Exception.StackTrace}";
30             NLogHandler.Instance.Error(message);
31             if (!filterContext.HttpContext.Request.IsAjaxRequest())
32             {
33                 filterContext.Controller.ViewData.Model = filterContext.Exception;
34                 filterContext.Result = new ViewResult
35                 {
36                     ViewName = "~/Views/Error/Error.cshtml",
37                     ViewData = filterContext.Controller.ViewData
38                 };
39             }
40             filterContext.Result = AjaxError(filterContext.Exception.Message, filterContext);
41 
42 
43 
44 
45             filterContext.ExceptionHandled = true;
46         }
47         /// <summary>
48         /// Ajaxes the error.
49         /// </summary>
50         /// <param name="message">The message.</param>
51         /// <param name="filterContext">The filter context.</param>
52         /// <returns>JsonResult</returns>
53         protected JsonResult AjaxError(string message, ExceptionContext filterContext)
54         {
55 
56             //If message is null or empty, then fill with generic message
57             if (String.IsNullOrEmpty(message))
58                 message = "Something went wrong while processing your request. Please refresh the page and try again.";
59             //Set the response status code to 500
60             filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
61             //Needed for IIS7.0
62             filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
63             return new JsonResult
64             {
65                 //can extend more properties 
66                 Data = new AjaxExceptionModel() { ErrorMessage = message },
67                 ContentEncoding = System.Text.Encoding.UTF8,
68                 JsonRequestBehavior = JsonRequestBehavior.DenyGet
69 
70             };
71 
72         }
73         /// <summary>
74         /// AjaxExceptionModel
75         /// </summary>
76         public class AjaxExceptionModel
77         {
78             /// <summary>
79             /// Gets or sets the error message.
80             /// </summary>
81             /// <value>
82             /// The error message.
83             /// </value>
84             public string ErrorMessage { get; set; }
85 
86         }
87 
88     }
89 }
View Code

然後在FilterConfig添加

Global.asax全局下添加

 

最後處理下ajax錯誤處理和伺服器錯誤呈現形式

@{
    ViewBag.Title = "General Site Error";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container">
    <div class="row text-center">
        <br/>
        <br />
        <br />
        <br />
        <br />
        <div class="col-md-6 col-md-offset-3 text-center">
            @{

                var exception = ViewData.Model;
                var statusCode = exception == null ? 404 : 500;
                Response.StatusCode = statusCode;
                if (statusCode == 404)
                {
                    <h1>404 Page not found!</h1>
                    <p>沒有找到該網頁!</p>
                }
                else if (statusCode == 500)
                {
                    <h1>500 程式異常</h1>
                    <p>
                        <a class="btn" data-toggle="collapse" href="#collapseExample" role="button" aria-expanded="false" aria-controls="collapseExample">
                            Error details
                        </a>
                    </p>
                    <div class="collapse" id="collapseExample">
                        <div class="card card-body">
                            <p style="text-align: left;">消息類型:@exception.GetType().Name<br />消息內容:@exception.Message <br />引發異常的方法:@exception.TargetSite <br />引發異常的對象:@exception.Source<br />錯誤詳細記錄:@exception.StackTrace</p>
                        </div>
                    </div>

                }
            }
            <p style="font-size: 14px; color: Gray">請使用瀏覽器的後退功能已保證您填寫的數據沒有丟失!</p>
        </div>
    </div>

    <div class="row text-center">
        <div class="col-md-8 col-md-offset-2">
            <h3> <i class="fa fa-lightbulb-o fa-5x"></i> </h3>
            <a href="@Url.Action("Index","Home")" class="btn">GO TO HOME PAGE</a>
        </div>
    </div>

</div>
 $(document).ajaxError(function (event, request, settings) {
            //request.responseText
            if (request.responseText != "") {
                var jsonValue = jQuery.parseJSON(request.responseText);
            }
            toastr.error("<li>settings.url:" + settings.url + "</li>" + "<li>request.status:" + request.status + "</li>" + "<li>request.statusText:" + request.statusText + "</li>" + "<li>ErrorMessage:" + jsonValue.ErrorMessage + "</li>");
        });

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、DataGridView 取得或者修改當前單元格的內容: 核心:DataGridView1.CurrentCell.Value; 1、當前單元格的Index: 列:DataGridView1.CurrentCell.ColumnIndex; 行:DataGridView1.CurrentCell ...
  • 因客戶需要實現PDF的預覽處理,在網上找了一些PDF線上預覽的解決方案,有的用PDFJS的線上預覽方式,有的使用PDFObject的嵌入式顯示,有的通過轉換JPG/PNG方式實現間接顯示的方式,開始是想通過簡單的方式,能夠使用JS插件實現預覽最好,可是線上預覽總是有一些不足,如不同瀏覽器的相容問題,... ...
  • 微信退款需要證書 data為已封裝好的xml數據 具體怎麼封裝>打開 ...
  • 在winForm窗體中綁定(註冊)事件的方法有兩種: 一、綁定事件 雙擊控制項,即進入.cs的代碼編輯頁面,會出現 類似於“ private void 控制項名稱_Click(object sender, DataGridViewCellEventArgs e){ } 的方法”,在”{ }“中添加邏輯代 ...
  • 最近需要對一個文件進行數量的分割,因為數據量龐大,所以就想到了通過寫程式來處理。將代碼貼出來以備以後使用。 //讀取文件的內容 放置於StringBuilder 中 StreamReader sr = new StreamReader(path, Encoding.Default); String ...
  • 根據GUID+DateTime.Now.Ticks生產唯一訂單號 ...
  • 前言 昨天和一個技術比較好的前輩聊了聊,發現有的時候自己的學習方式有些問題,不知道有沒有和我一樣的越學習越感覺到知識的匱乏不過能認識到這個問題的同學們,也不要太心急路是一步一步走的飯是一口一口吃的認識到錯誤才能更高的改進錯誤,腳踏實地只要有上勁學習的心,終會有所成就。認識到自己薄弱的地方進行學習,要 ...
  • 一、字元串 通過string定義一個字元串,或者通過String類來創建對象。 通過new String() 創建有一下幾種構造函數(從元數據),以此順序創建string; // // 摘要: // 將 System.String 類的新實例初始化為由 Unicode 字元數組指示的值。 // // ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...