iT邦幫忙

2022 iThome 鐵人賽

DAY 5
1
Software Development

ASP.NET Core 30 天旅程系列 第 5

[Day05]-自定義 Middleware

  • 分享至 

  • xImage
  •  

承上篇,.NET Core有提供許多的 Middleware給大家使用,但如果大家想要自訂義也是可以的!
今天來實作一個 LOG Middleware
那麼我們就開始吧!

自定義 Middleware

  • 建一個Class
  • 必須有一個建構式,透過建構子所傳入的 RequestDelegate 參考Pipeline裡的下一個Middleware
  • Middleware透過實做Invoke 或是 InvokeAsync方法,並且搭配 HttpContext參數

實作如下
於目錄底下建立一個 Middleware資料夾,建立一個檔案命名為CustomerExceptionMiddleware.cs

using Serilog;

namespace web.Middleware
{
    public class CustomerExceptionMiddleware
    {
        private readonly RequestDelegate _next;
        public CustomerExceptionMiddleware(RequestDelegate next, IServiceProvider serviceProvider)
        {
            _next = next;
        }
        public async Task Invoke(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "錯誤訊息 => " + ex.Message);
                if (ex.InnerException != null)
                {
                    Log.Fatal(ex.InnerException, ex.InnerException.Message);
                }

            }
        }
    }
}

*這裡有用到套件Serilog,NuGet安裝Serilog、Serilog.Sinks.Console、Serilog.Sinks.File,之後再詳細說明使用方法。

由上圖可看到我們使用try-catchnext包起來,所以若是有任何的Exception都會被catch起來,留下Log。

接著,我們打開Program.cs,先在最上方加入LOG的設定

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console() //將Log輸出到終端機
    .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day) //將Log輸出為檔案,命名以當天日期為區分
    .CreateLogger();

全域

我們把LOG Middleware放進Program.cs,要注意擺放的順序喔!(詳細可看上一篇
https://ithelp.ithome.com.tw/upload/images/20220920/20152200EATjepjzZl.png

測試
HomeController.cs
在Index()直接 throw new Exception();
https://ithelp.ithome.com.tw/upload/images/20220920/201522006L7H2gbaPT.png

結果
https://ithelp.ithome.com.tw/upload/images/20220920/20152200rfsAKqc19v.png

非全域

  • 先拿掉Program.cs的 app.UseMiddleware();

  • 在Action加上 [MiddlewareFilterAttribute]
    https://ithelp.ithome.com.tw/upload/images/20220920/20152200cW1QNRZhA6.png

  • 建立Class,定義要加入的 Middleware
    CustomerExceptionPipeline.cs

using web.Middleware;

namespace web.Pipeline
{
    public class CustomerExceptionPipeline
    {
        public void Configure(IApplicationBuilder app)
        {
            app.UseMiddleware<CustomerExceptionMiddleware>();
        }
    }
}

結果
https://ithelp.ithome.com.tw/upload/images/20220920/2015220051quqGzGwI.png


參考資料

那今天就到這邊囉,大家明天見!


上一篇
[Day04]-Middleware
下一篇
[Day06]-Serilog
系列文
ASP.NET Core 30 天旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言