日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Asp.NetCore依赖注入和管道方式的异常处理及日志记录

發布時間:2023/12/4 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Asp.NetCore依赖注入和管道方式的异常处理及日志记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

????在業務系統,異常處理是所有開發人員必須面對的問題,在一定程度上,異常處理的能力反映出開發者對業務的駕馭水平;本章將著重介紹如何在 WebApi 程序中對異常進行捕獲,然后利用 Nlog 組件進行記錄;同時,還將介紹兩種不同的
異常捕獲方式:管道捕獲/服務過濾;通過本練習,將學習到如何捕獲異常、處理異常跳轉、記錄異常信息。

搭建框架

????首先,創建一個 WebApi 項目,選擇 Asp.Net Core Web 應用程序;

  • 進一步選擇 Api 模板,這里使用的 .netcore 版本為 2.1

  • 取消勾選 “啟用 Docker 支持(E)” 和 “為 Https 配置(C)”,點擊確定,得到一個完整的 WebApi 項目框架,如圖

  • 直接按 F5 運行項目,一切正常,程序啟動后進入默認路由調用,并輸出結果

異常路由

  • 一切看起來都非常正常和美好,但,禍之福所倚;接下來我們在 接口 Get() 中人為的制造一點麻煩。

? ? ? ?[HttpGet] ? ? ? ?public ActionResult<IEnumerable<string>> Get(){ ? ? ? ? ? ?throw new Exception("出錯了....."); ? ? ? ? ? ?return new string[] { "value1", "value2" };}
  • 這是由于項目配置了運行環境變量 ASPNETCORE_ENVIRONMENT=Development 后,Startup.cs 中配置了開發環境下,使用系統默認頁,所以我們才可以看到上面的異常信息

  • 如果你把環境變量設置為 ASPNETCORE_ENVIRONMENT=Production ,你會發現,在異常發生的時候,你得到了一個空白頁。

異常處理方式一:服務過濾

????在傳統的 Asp.Net MVC 應用程序中,我們一般都使用服務過濾的方式去捕獲和處理異常,這種方式非常常見,而且可用性來說,體驗也不錯,幸運的是 Asp.Net Core 也完整的支持該方式,接下來創建一個全局異常處理類 CustomerExceptionFilter


  • CustomerExceptionFilter 繼承自 IExceptionFilter 接口,并實現 void OnException(ExceptionContext context) 方法,在 CustomerExceptionFilter
    構造方法中,定義了兩個參數,用于記錄異常日志和獲取程序運行環境變量

  • 在接下來的 OnException 方法中,利用 environment 進行產品環境的判斷,并使用 logger 將日志寫入硬盤文件中,為了將日志寫入硬盤,
    需要引用 Nuget 包 NLog.Extensions.Logging/NLog.Web.AspNetCore ,并在 Startup.cs 文件的 Configure 方法中添加擴展

  • 上面的代碼讀取了配置文件 nlog.config 并設置為 NLog 的配置,該文件定義如下

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="info">


? <!-- Load the ASP.NET Core plugin -->

? <extensions>

? ? <add assembly="NLog.Web.AspNetCore"/>

? </extensions>


? <!-- Layout: https://github.com/NLog/NLog/wiki/Layout%20Renderers -->

? <targets>

? ? <target xsi:type="File" name="errorfile" fileName="/data/logs/logfilter/error-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|? ${message} ${exception}|${aspnet-Request-Url}" />

? ? <target xsi:type="Null" name="blackhole" />

? </targets>


? <rules>

? ? <logger name="Microsoft.*" minlevel="Error" writeTo="blackhole" final="true" />

? ? <logger name="*" minlevel="Error" writeTo="errorfile" />

? </rules>

</nlog>

  • 為了在 WebApi 控制器中使用 CustomerExceptionFilter 過濾器,我們還需要在 Startup.cs 將 CustomerExceptionFilter 注入到容器中

  • 最后,在控制器 ValuesController 中應用該異常過濾器

  • 現在,按 F5 啟動程序,如預期所料,報錯信息被 CustomerExceptionFilter 捕獲,并轉換為 json 格式輸出

  • 同時,NLog 組件也將日志信息記錄到了硬盤中

異常處理方式二:中間件捕獲

????接下來利用 .NetCore 的管道模式,在中間件中對異常進行捕獲,首先,創建一個中間件

  • 代碼比較簡單,在管道中使用 try/catch 進行捕獲異常,創建 HandleException(HttpContext context, Exception e) 處理異常,判斷是 Development 環境下,輸出詳細的錯誤信息,非 Development 環境僅提示調用者“抱歉,出錯了”,同時使用 NLog 組件將日志寫入硬盤;
    同樣,在 Startup.cs 中將 ExceptionMiddleware 加入管道中

  • 一切就緒,按 F5 運行程序,網頁中輸出了期望中的 json 格式錯誤信息,同時 NLog 組件也將日志寫入了硬盤

結語

????在本例中,通過依賴注入和管道中間件的方式,演示了兩種不同的全局捕獲異常處理的過程;值得注意到是,兩種方式對于 NLog 的使用,都是一樣的,沒有任何差別,代碼無需改動;實際項目中,也是應當區分不同的業務場景,輸出不同的
日志信息,不管是從安全或者是用戶體驗友好性上面來說,都是非常值得推薦的方式,全局異常捕獲處理,完全和業務剝離。

  • 努力為開源社區作貢獻,推薦一個自己開發的基于 .netcore+pgsql 的快速開發腳手架,內置 ORM框架,github地址:https://github.com/lianggx/mystaging

  • 文中如有疏漏之處,歡迎指正。

  • 源碼下載:https://files.cnblogs.com/files/viter/Ron.LogFilter.zip


總結

以上是生活随笔為你收集整理的Asp.NetCore依赖注入和管道方式的异常处理及日志记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。