Contents

ASP.NET Core 中間件(Middleware)

中間件(Middleware)在程式架構上設計是很重要功能,之前我在學習 Spring Boot 對應 Request 所對應處理都使用 AOP,AOP概念很像 Middleware,但還是有點差異的,要如何使用 Middleware 讓開發程式更有效率、簡單,不需要異動程式這是很重要的。

這個筆記很久之前就寫完了,但想說有空再整理一下,結果都沒改什麼東西。最近剛好寫中間件文章,覺得還是整理出來好了。

處理 HTTP Request,很重要的管道。例如: 網頁帳號檢查、錯誤的處理。

…->Logging ->StaticFiles -> MVC ->…

ASP.NET Core 中間件
Logging 記錄使用者 IP等資訊
StaticFiles 取得js/img靜態文件
MVC 終端中間件。

可做到的事情:

  • 可同時被訪問和請求
  • 可處理請求後,然後將請求傳遞給下一個中間件
  • 可以處理請求後,并使管道短路。
  • 可以處理傳出響應。
  • 中間件是按照添加的順序執行的。

官方順序可以參考:
https://i.imgur.com/9xF8rfr.png
ASP.NET Core 中介軟體 | Microsoft Docs

中間件範列

靜態文件建立需要建立 wwwroot

https://i.imgur.com/O39qbsh.png

app.Run()是一個終端中間件,他使用會短路。
下面範例只會印出Hello World1

1
2
3
4
5
6
7
8

app.Run(async (context)=>{
    await context.Response.WriteAsync("hello world 1");
});
    
    app.Run(async (context)=>{
    await context.Response.WriteAsync("hello world 2");
});

app.Use可以解決這個問題,使用 next可調用到下一個 Middleware。

1
2
3
4
5
6
7
8
app.Use(async (context,next)=>{
    context.Response.ContentType = "text/plain;charset=utf-8";
    await context.Response.WriteAsync("hello world 1");
    await next();
});

    app.Run(async (context)=>{
    await context.Response.WriteAsync("hello world 2");

靜態文件

1
2
//靜態文件中間件
app.UseStaticFiles();

UseDefaultFiles一定要放在 UseStaticFiles 前面。

1
2
//加入默認文件中間件 index.html index.htm default.html default.htm
app.UseDefaultFiles();

更改預設 html網頁;

1
2
3
4
5
DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions();
defaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFileNames.Add("hello.html");

app.UseDefaultFiles(defaultFilesOptions);

這邊太長了

1
2
3
4
5
6
7
// app.UseFileServer(); // 結合UseStaticFiles, UseDefaultFiles, UseDirectoryBrowser
// app.UseDirectoryBrowser();  // 查看文件夾內容

FileServerOptions fileServerOptions = new FileServerOptions();
fileServerOptions.DefaultFilesOptions.DefaultFileNames.Clear();
fileServerOptions.DefaultFilesOptions.DefaultFileNames.Add("hello.htm");
app.UseFileServer(fileServerOptions); 

app.use...有很多中間件可以用。

異常頁面中間件

盡量放在中間件前面,預防其他錯誤,否則不會跑出結果。

1
2
3
4
// 盡量放在中間件前面,預防其他錯誤,否則不會跑出結果
if(env.IsDevelopment()){
    app.UseDeveloperExceptionPage();
}

自定義中間件異常

1
2
3
DeveloperExceptionPageOptions developerExceptionPageOptions = new DeveloperExceptionPageOptions();
developerExceptionPageOptions.SourceCodeLineCount = 1;
app.UseDeveloperExceptionPage(developerExceptionPageOptions);

.Net 6 之前版本要怎麼辦? 我之前有寫過這篇.Net Core Middleware 擷取 Request 參數 - 程式狂想筆記可以參考。

其他文章

ASP.NET Core 基礎 - Middleware-黑暗執行緒

ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成 - 雨夜朦胧 - 博客园

c# - How To Register Services For Custom .Net Core Middleware - Stack Overflow

收集 ASP.NET Core 網站所有的 HTTP Request 資訊

Global Error Handling in ASP.NET Core Web API - Code Maze