中間件(Middleware)在程式架構上設計是很重要功能,之前我在學習 Spring Boot 對應 Request 所對應處理都使用 AOP,AOP概念很像 Middleware,但還是有點差異的,要如何使用 Middleware 讓開發程式更有效率、簡單,不需要異動程式這是很重要的。
這個筆記很久之前就寫完了,但想說有空再整理一下,結果都沒改什麼東西。最近剛好寫中間件文章,覺得還是整理出來好了。
處理 HTTP Request,很重要的管道。例如: 網頁帳號檢查、錯誤的處理。
…->Logging ->StaticFiles -> MVC ->…
ASP.NET Core 中間件
Logging 記錄使用者 IP等資訊
StaticFiles 取得js/img靜態文件
MVC 終端中間件。
可做到的事情:
- 可同時被訪問和請求
- 可處理請求後,然後將請求傳遞給下一個中間件
- 可以處理請求後,并使管道短路。
- 可以處理傳出響應。
- 中間件是按照添加的順序執行的。
官方順序可以參考:
ASP.NET Core 中介軟體 | Microsoft Docs
中間件範列
靜態文件建立需要建立 wwwroot
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