在上一篇教學中我為大家介紹了Web API中Filter的開發使用,其中講到ExceptionFilter時留了一個坑:ExceptionFilter只能截獲並處理Action執行過程中發生的異常,在Action執行過程之外如果出現異常,ExceptionFilter是無能為力的。
這些例外包括:
1、 Controller建構法中出現的例外狀況
2、 MessageHandlers中出現的例外狀況
2、 MessageHandlers中出現的例外狀況
3、 出現在路由過程中出現的異常
4、 Body在序列化/反序列化過程中出現的異常
由此可以看出,ExceptionFilter只能解決ApiControler成功實例化後並執行Action期間出現的例外;為了解決這一個問題,在WEB API中除了ExceptionFilter外還引入了兩個針對異常記錄、處理的擴充點:
IExceptionLogger 和IExceptionHandler。
而這兩個擴充功能是作為Web API的管道元件進行註冊管理的,並且,他們有不同的分工:
IExceptionLogger作為異常日誌記錄,負責 IExceptionLogger作為異常記錄記錄,他貫穿整個Web API的生命週期中,在Web API框架裡,任何一個請求週期中出現任何一個未被捕獲/處理的異常都會首先進入這個異常日誌記錄管道進行異常Log記錄,在Web API中可以註冊多個IExceptionLogger實例負責不同的異常處理。
IExceptionHandler作為異常處理元件,負責異常發生後的處理工作,他處於異常處理管道的最末端,當IExceptionLogger元件進行一場記錄完畢、沒有相關的ExceptoinFilter進行異常處理時,才會最終最終呼叫ExceptionHandler進行異常處理,在Web API中,有且僅有一個ExceptionHandler進行異常的處理。
在Web API架構中給出了兩個基底類別:ExceptionLogger和ExceptionHandler,在使用ExceptionLogger基底類別時,他提供了ShouldLog虛方法,該方法在基底類別中被調用,其作用在於避免同一個異常被同一個ExceptionLogger實例重複記錄(如當後續的管道中該異常又被拋出,或者同一個ExceptionLogger物件不小心被註冊了兩次就會出現重複記錄的可能)我們也能複寫ShouldLog方法加入我們自己的異常記錄判斷邏輯以針對不同的場景進行不同的ExceptionLogger呼叫。如果有興趣可以反編譯ExceptionLogger基類別看看,他使用了顯示介面實現,還挺有意思的一個技巧。下面我們來看一個ExceptionLogger使用的例子:
public class ErroLogger : ExceptionLogger { public async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken) { var sb = new StringBuilder(); //获取Log组件 ILogger log = LogManager.GetCurrentClassLogger(); var request = context.Request; sb.AppendLine("URL:"); //获取URL var url = request.RequestUri.ToString(); sb.AppendLine(url); log.Error(context.Exception,sb.ToString(),""); } public override bool ShouldLog(ExceptionLoggerContext context) { return context.Exception is DemoException && base.ShouldLog(context); } }
在這個例子中,我們重寫了ShouldLog,保證了這個ExceptionLogger只記錄DemoException這個類型的異常,並且也呼叫了基類方法,保證不會重複記錄同一個異常。在LogAsync方法中,我透過Log元件記錄了導致異常的請求URL,也記錄了異常訊息。
接下來我們要對這個元件進行註冊:
在App_Start/WebApiConfig.cs檔案中的Register方法中寫入
config.Services.Add(typeof(IExceptionLogger),new ErroLogger());
這樣,一個針對DemoException的異常記錄元件就開發完成並註冊完成了,當Web API執行管道中出現未處理的DemoException異常,均會調用則個組件進行記錄。
接下來我們來寫一個ExceptionHandler,在整個Web API框架中,ExceptionHandler只能提供一個實例,與ExceptionLogger一樣,我們可以繼承ExceptionHandler基類來簡化異常處理,在ExceptionHandler中也提供了ShouldHandle方法來判斷該異常是否應該處理,避免重複處理管道中其他環節重複拋出的異常。我們也提供一個例子:
public class ErrorHandler : ExceptionHandler { public override async Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) { if (context.Exception is DemoException) { context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.BadRequest,new {Message=context.Exception.Message})); } else { context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError,new {Message = "服务器已被外星人绑架"})); } } }
在這個範例中,我們判斷了例外的類型,並根據不同的例外返回客戶端不同的回應內容和不同的HTTP狀態碼。
接著在設定中註冊這個例外處理模組,在App_Start/WebApiConfig.cs檔案中的Register方法中寫入
##
config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());就取代了系統預設的ExceptionHandler,可以使用我們自訂的Handler進行異常的處理了。 在異常記錄、處理過程中,我們都碰到對應的異常上下文參數,我們能透過這個參數取得目前請求的上下文,取得請求、回應(小心有時會為空哦)、捕捉到該異常的catch塊資訊等內容,我們可以利用這些資訊來更好地描述、記錄、處理異常。 ###
到這裡ExceptionLogger元件和ExceptionHandler元件簡單的開發就完成了。在開發的過程中我們可以看到,ExceptionLogger負責了全域的例外記錄,在Web API框架管道下出現未處理的異常ExceptionLogger都會進行擷取、記錄。而ExceptionHandler和ExceptionFilter功能是有重疊的,那麼何時使用ExceptionHandler何時使用ExceptionFilter呢?我們可以將兩者的差異列出如下的表格:
# |
ExceptionFilter |
ExceptionHandler |
#作用域 |
Controller、Action |
##全域
|
實例數量
|
無限制
|
無限制 |
全域唯一 |
#作用條件 |
實例化成功之後
#########Web API#######成功加載之後##################### 經過上面的表我們可以看出,如果處理顆粒度細緻到Controller、Action級別時,ExceptionFilter處理起來會更得心應手,他已經能精確定位到某個Action,然後可以針對目前Action做客製化開發。而ExceptionHandler作用域遠大於ExceptionFilter,他處理全域更有優勢。 ###### 關於Web API異常處理的相關內容我就講這麼一些,如果在文章中有任何不正確的地方或者疑問,歡迎大家為我指出。 ###以上是Asp.Net Web API 異常處理經驗總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C#並不總是與.NET捆綁在一起。 1)C#可以在Mono運行時環境中運行,適用於Linux和macOS。 2)在Unity遊戲引擎中,C#用於腳本編寫,不依賴.NET框架。 3)C#還可用於嵌入式系統開發,如.NETMicroFramework。

C#在.NET生態系統中扮演核心角色,是開發者的首選語言。 1)C#提供高效、易用的編程方式,結合C、C 和Java的優點。 2)通過.NET運行時(CLR)執行,確保跨平台高效運行。 3)C#支持從基本到高級的用法,如LINQ和異步編程。 4)優化和最佳實踐包括使用StringBuilder和異步編程,提高性能和可維護性。

C#是微軟在2000年發布的編程語言,旨在結合C 的強大功能和Java的簡潔性。 1.C#是一種類型安全、面向對象的編程語言,支持封裝、繼承和多態。 2.C#的編譯過程將代碼轉化為中間語言(IL),然後在.NET運行時環境(CLR)中即時編譯成機器碼執行。 3.C#的基本用法包括變量聲明、控制流和函數定義,而高級用法涵蓋異步編程、LINQ和委託等。 4.常見錯誤包括類型不匹配和空引用異常,可通過調試器、異常處理和日誌記錄來調試。 5.性能優化建議包括使用LINQ、異步編程和提高代碼可讀性。

C#是一種編程語言,而.NET是一個軟件框架。 1.C#由微軟開發,適用於多平台開發。 2..NET提供類庫和運行時環境,支持多語言。兩者協同工作,構建現代應用。

C#.NET是一個強大的開發平台,結合了C#語言和.NET框架的優勢。 1)它廣泛應用於企業應用、Web開發、遊戲開發和移動應用開發。 2)C#代碼編譯成中間語言後由.NET運行時環境執行,支持垃圾回收、類型安全和LINQ查詢。 3)使用示例包括基本控制台輸出和高級LINQ查詢。 4)常見錯誤如空引用和類型轉換錯誤可以通過調試器和日誌記錄解決。 5)性能優化建議包括異步編程和優化LINQ查詢。 6)儘管面臨競爭,C#.NET通過不斷創新保持其重要地位。

C#.NET的未來趨勢主要集中在雲計算、微服務、AI和機器學習集成以及跨平台開發三個方面。 1)雲計算和微服務:C#.NET通過Azure平台優化雲環境表現,支持構建高效微服務架構。 2)AI和機器學習集成:借助ML.NET庫,C#開發者可在應用中嵌入機器學習模型,推動智能化應用發展。 3)跨平台開發:通過.NETCore和.NET5 ,C#應用可在Windows、Linux和macOS上運行,擴展部署範圍。

C#.NET開發的最新動態和最佳實踐包括:1.異步編程提高應用響應性,使用async和await關鍵字簡化非阻塞代碼;2.LINQ提供強大查詢功能,通過延遲執行和表達式樹高效操作數據;3.性能優化建議包括使用異步編程、優化LINQ查詢、合理管理內存、提升代碼可讀性和維護性、以及編寫單元測試。

如何利用.NET構建應用?使用.NET構建應用可以通過以下步驟實現:1)了解.NET基礎知識,包括C#語言和跨平台開發支持;2)學習核心概念,如.NET生態系統的組件和工作原理;3)掌握基本和高級用法,從簡單控制台應用到復雜的WebAPI和數據庫操作;4)熟悉常見錯誤與調試技巧,如配置和數據庫連接問題;5)應用性能優化與最佳實踐,如異步編程和緩存。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器