@elf-express/admin-net-mcp 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +83 -88
- package/knowledge/Furion_Teaching_Manual/04-1-/351/205/215/347/275/256.md +442 -0
- package/knowledge/Furion_Teaching_Manual/04-2-/351/201/270/351/240/205.md +363 -0
- package/knowledge/Furion_Teaching_Manual/05-1-/345/213/225/346/205/213WebAPI.md +825 -0
- package/knowledge/Furion_Teaching_Manual/05-2-HttpContext.md +217 -0
- package/knowledge/Furion_Teaching_Manual/05-3-/347/257/251/351/201/270/345/231/250/346/224/224/346/210/252/345/231/250AOP.md +581 -0
- package/knowledge/Furion_Teaching_Manual/05-4-/350/253/213/346/261/202/347/250/275/346/240/270/346/227/245/350/252/214.md +129 -0
- package/knowledge/Furion_Teaching_Manual/05-5-/344/270/255/344/273/213/350/273/237/351/253/224Middleware.md +328 -0
- package/knowledge/Furion_Teaching_Manual/05-6-Vue-React-Angular/344/273/213/351/235/242/344/273/243/347/220/206.md +317 -0
- package/knowledge/Furion_Teaching_Manual/06-1/350/246/217/347/257/204/345/214/226/346/216/245/345/217/243.md +1458 -0
- package/knowledge/Furion_Teaching_Manual/06-2/347/254/254/344/270/211/346/226/271API_Scalar.md +91 -0
- package/knowledge/Furion_Teaching_Manual/07-/345/217/213/345/245/275/344/276/213/345/244/226/350/231/225/347/220/206.md +511 -0
- package/knowledge/Furion_Teaching_Manual/08-1-/350/263/207/346/226/231/351/251/227/350/255/211/345/237/272/347/244/216/344/275/277/347/224/250.md +587 -0
- package/knowledge/Furion_Teaching_Manual/10-1-SqlSugar/346/225/264/345/220/210.md +336 -0
- package/knowledge/Furion_Teaching_Manual/11-SaaS /345/244/232/347/247/237/346/210/266/347/255/206/350/250/230.md" +271 -0
- package/knowledge/Furion_Teaching_Manual/12-furion-dependency-injection.md +408 -0
- package/knowledge/Furion_Teaching_Manual/13-/347/211/251/344/273/266/350/263/207/346/226/231/346/230/240/345/260/204/357/274/210Mapster/357/274/211.md +162 -0
- package/knowledge/Furion_Teaching_Manual/14-/345/210/206/345/270/203/345/274/217/347/274/223/345/255/230.md +311 -0
- package/knowledge/Furion_Teaching_Manual/15-/345/256/211/345/205/250/351/211/264/346/235/203.md +832 -0
- package/knowledge/Furion_Teaching_Manual/17-/346/252/242/350/246/226/347/257/204/346/234/254/345/274/225/346/223/216.md +327 -0
- package/knowledge/Furion_Teaching_Manual/18-/346/227/245/350/252/214/350/250/230/351/214/204.md +639 -0
- package/knowledge/Furion_Teaching_Manual/19-1-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/345/237/272/347/244/216/344/275/277/347/224/250.md +621 -0
- package/knowledge/Furion_Teaching_Manual/19-2-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/351/200/262/351/232/216/346/214/207/345/215/227.md +928 -0
- package/knowledge/Furion_Teaching_Manual/19-3-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/345/270/270/350/246/213/345/225/217/351/241/214.md +362 -0
- package/knowledge/Furion_Teaching_Manual/20-/350/263/207/346/226/231/345/212/240/350/247/243/345/257/206.md +286 -0
- package/knowledge/Furion_Teaching_Manual/20-/351/231/204/351/214/204-KSort/350/263/207/346/226/231/347/260/275/345/220/215/345/256/214/346/225/264/345/216/237/345/247/213/347/242/274.md +305 -0
- package/knowledge/Furion_Teaching_Manual/21-/345/205/250/347/220/203/345/214/226/345/222/214/346/234/254/345/234/260/345/214/226.md +342 -0
- package/knowledge/Furion_Teaching_Manual/22-/344/272/213/344/273/266/345/214/257/346/265/201/346/216/222EventBus.md +448 -0
- package/knowledge/Furion_Teaching_Manual/23-JSON/345/272/217/345/210/227/345/214/226.md +340 -0
- package/knowledge/Furion_Teaching_Manual/24-/345/215/263/346/231/202/351/200/232/350/250/212SignalR.md +247 -0
- package/knowledge/Furion_Teaching_Manual/25-/350/274/224/345/212/251/350/247/222/350/211/262/346/234/215/345/213/231WorkerService.md +295 -0
- package/knowledge/Furion_Teaching_Manual/26-1-/346/216/222/347/250/213/344/275/234/346/245/255/345/256/232/346/231/202/344/273/273/345/213/231.md +631 -0
- package/knowledge/Furion_Teaching_Manual/26-2-Cron/350/241/250/351/201/224/345/274/217.md +203 -0
- package/knowledge/Furion_Teaching_Manual/26-3-/344/273/273/345/213/231/344/275/207/345/210/227TaskQueue.md +215 -0
- package/knowledge/Furion_Teaching_Manual/27-/345/210/206/346/225/243/345/274/217ID/347/224/237/346/210/220.md +86 -0
- package/knowledge/Furion_Teaching_Manual/28-/346/250/241/347/265/204/345/214/226/351/226/213/347/231/274.md +68 -0
- package/knowledge/Furion_Teaching_Manual/29-/346/265/201/350/256/212/347/211/251/344/273/266Clay.md +313 -0
- package/knowledge/Furion_Teaching_Manual/30-/350/204/253/346/225/217/350/231/225/347/220/206/357/274/210Sensitive Detection).md" +168 -0
- package/knowledge/Furion_Teaching_Manual/32-/346/234/203/350/251/261/345/222/214/347/213/200/346/205/213/347/256/241/347/220/206.md +147 -0
- package/knowledge/Furion_Teaching_Manual/33-IPC/347/250/213/345/272/217/351/200/232/350/250/212.md +98 -0
- package/knowledge/Furion_Teaching_Manual/34-2-Docker/351/203/250/347/275/262.md +313 -0
- package/knowledge/Furion_Teaching_Manual/34-3-Nginx/351/203/250/347/275/262.md +157 -0
- package/knowledge/Furion_Teaching_Manual/34-8-WindowsService/351/203/250/347/275/262.md +112 -0
- package/knowledge/Furion_Teaching_Manual/35-1-Docker/347/222/260/345/242/203/346/214/201/347/272/214/351/203/250/347/275/262Jenkins.md +169 -0
- package/knowledge/Furion_Teaching_Manual/36-1-/345/226/256/345/205/203/346/270/254/350/251/246/346/225/264/345/220/210/346/270/254/350/251/246.md +275 -0
- package/knowledge/Furion_Teaching_Manual/36-3-/345/237/272/346/272/226/346/270/254/350/251/246Benchmarking.md +80 -0
- package/knowledge/attributes.md +153 -0
- package/knowledge/config.md +147 -0
- package/knowledge/entity.md +115 -0
- package/knowledge/event.md +124 -0
- package/knowledge/plugin.md +136 -0
- package/knowledge/service.md +146 -0
- package/knowledge/sqlsugar.md +172 -0
- package/knowledge/vue-typescript.md +338 -0
- package/package.json +3 -2
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# 5.2 HttpContext
|
|
2
|
+
|
|
3
|
+
## 📝 模組更新日誌
|
|
4
|
+
|
|
5
|
+
### 新特性
|
|
6
|
+
|
|
7
|
+
- **新增** HttpContext 取得客戶端 IPv4 位址的 `GetRemoteIpAddressToIPv4` 方法 `xff` 參數 `4.9.4.3` ⏱️2024.07.01 `c280dfd`
|
|
8
|
+
|
|
9
|
+
### 問題修復
|
|
10
|
+
|
|
11
|
+
- **修復** 透過 HttpContext 擴充方法 `GetRemoteIpAddressToIPv4(true)` 取得客戶端 IP 位址出現 null 問題 `4.9.8.6` ⏱️2026.01.26 `8ff27e5` `@boaro` `!934`
|
|
12
|
+
- **修復** 透過 HttpContext 擴充方法 `GetRemoteIpAddressToIPv4(true)` 取得客戶端 IP 位址出現多個 IP 問題 `4.9.7.246` ⏱️2026.01.14 `#IDJO6T`
|
|
13
|
+
- **修復** `HttpRequest.GetRequestUrlAddress` 擴充取得請求位址遺失埠號問題 `4.9.4.5` ⏱️2024.07.11 `6df5dbd`
|
|
14
|
+
- **修復** 啟用請求 Body 重複讀取且在授權之前讀取導致非 GET/HEAD/OPTION 請求異常 `4.8.7.15` ⏱️2023.03.19 `#I6NX9E`
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 5.2.1 關於 HttpContext
|
|
19
|
+
|
|
20
|
+
在 ASP.NET 的時代,我們通常透過 `HttpContext` 全域靜態類別取得請求上下文,但在 ASP.NET Core 中,`HttpContext` 是一個非靜態的抽象類別,無法手動建立,也無法透過靜態方式取得。
|
|
21
|
+
|
|
22
|
+
雖然在 ASP.NET Core 中無法直接取得 `HttpContext` 物件,但微軟提供了注入 `IHttpContextAccessor` 的方式來取得。
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 5.2.2 取得 HttpContext
|
|
27
|
+
|
|
28
|
+
ASP.NET Core 和 Furion 提供了多種存取 `HttpContext` 的方式。
|
|
29
|
+
|
|
30
|
+
### 5.2.2.1 在 ControllerBase 衍生類別中
|
|
31
|
+
|
|
32
|
+
在 `ControllerBase` 衍生類別中,可以直接透過 `HttpContext` 屬性取得:
|
|
33
|
+
|
|
34
|
+
```csharp
|
|
35
|
+
public class HomeController : Controller
|
|
36
|
+
{
|
|
37
|
+
public IActionResult Index()
|
|
38
|
+
{
|
|
39
|
+
// HttpContext 是 Controller/ControllerBase 物件的屬性
|
|
40
|
+
var httpContext = HttpContext;
|
|
41
|
+
return View();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 5.2.2.2 注入 IHttpContextAccessor
|
|
47
|
+
|
|
48
|
+
在 Furion 框架中,預設已經註冊了 `IHttpContextAccessor` 服務,因此可以透過建構函式注入該介面:
|
|
49
|
+
|
|
50
|
+
```csharp
|
|
51
|
+
public class AppService
|
|
52
|
+
{
|
|
53
|
+
public AppService(IHttpContextAccessor httpContextAccessor)
|
|
54
|
+
{
|
|
55
|
+
var httpContext = httpContextAccessor.HttpContext;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 5.2.2.3 透過 App.HttpContext
|
|
61
|
+
|
|
62
|
+
`App` 靜態類別也提供了 `App.HttpContext` 來取得 `HttpContext` 物件:
|
|
63
|
+
|
|
64
|
+
```csharp
|
|
65
|
+
var request = App.HttpContext.Request;
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
> **非 Web 中存取**:在 Web 完整的生命週期內,`App.HttpContext` 都是有效的,但在非 Web 中會回傳 `null`,應避免在多執行緒、事件匯流排、定時任務等中使用。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 5.2.3 HttpContext 擴充方法
|
|
73
|
+
|
|
74
|
+
Furion 框架基於 `HttpContext` 提供了一些常用的擴充方法。
|
|
75
|
+
|
|
76
|
+
### 5.2.3.1 取得當前請求的特性 Attribute
|
|
77
|
+
|
|
78
|
+
下列程式碼通常用於授權 Handler 中:
|
|
79
|
+
|
|
80
|
+
```csharp
|
|
81
|
+
var attribute = httpContext.GetMetadata<SomeAttribute>();
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**在 Middleware 中介軟體中取得特性的方式:**
|
|
85
|
+
|
|
86
|
+
```csharp
|
|
87
|
+
var endpointFeature = httpContext.Features.Get<IEndpointFeature>();
|
|
88
|
+
var attribute = endpointFeature?.Endpoint?.Metadata?.GetMetadata<SomeAttribute>();
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 5.2.3.2 設定 Swagger 自動授權
|
|
92
|
+
|
|
93
|
+
Swagger 預設不能記住授權資訊,一旦重新整理瀏覽器就會自動清空。Furion 提供了該擴充,即使重新整理瀏覽器也能保持授權狀態:
|
|
94
|
+
|
|
95
|
+
```csharp
|
|
96
|
+
// 檢查使用者登入和產生 token 的程式碼...
|
|
97
|
+
|
|
98
|
+
// 呼叫該擴充,即可實現 Swagger 重新整理也能記住登入
|
|
99
|
+
httpContext.SigninToSwagger("你的token");
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 5.2.3.3 退出 Swagger 授權
|
|
103
|
+
|
|
104
|
+
透過後端程式碼強制讓 Swagger 授權失效,只針對下一次請求有效:
|
|
105
|
+
|
|
106
|
+
```csharp
|
|
107
|
+
httpContext.SignoutToSwagger();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 5.2.3.4 取得本地 IP 位址
|
|
111
|
+
|
|
112
|
+
```csharp
|
|
113
|
+
// IPv4
|
|
114
|
+
var ipv4 = httpContext.GetLocalIpAddressToIPv4();
|
|
115
|
+
|
|
116
|
+
// IPv6
|
|
117
|
+
var ipv6 = httpContext.GetLocalIpAddressToIPv6();
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 5.2.3.5 取得客戶端 IP 位址
|
|
121
|
+
|
|
122
|
+
```csharp
|
|
123
|
+
// IPv4
|
|
124
|
+
var ipv4 = httpContext.GetRemoteIpAddressToIPv4();
|
|
125
|
+
// Furion 4.9.4.3+ 版本支援設定 xff: true,優先取得請求標頭 X-Forwarded-For 轉發的 IP 位址
|
|
126
|
+
|
|
127
|
+
// IPv6
|
|
128
|
+
var ipv6 = httpContext.GetRemoteIpAddressToIPv6();
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
> **取得不到真實 IP 的處理方式**
|
|
132
|
+
>
|
|
133
|
+
> 使用了 Nginx 反向代理後可能會取得不到客戶端真實的 IP 位址,這時需要在 `Startup.cs` 中加入 IP 位址轉發設定:
|
|
134
|
+
|
|
135
|
+
```csharp
|
|
136
|
+
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
|
137
|
+
{
|
|
138
|
+
app.UseForwardedHeaders(new ForwardedHeadersOptions
|
|
139
|
+
{
|
|
140
|
+
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// 其他程式碼...
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
如果加入以上設定後取得的仍然是 Nginx 代理伺服器的位址,可以嘗試使用以下設定:
|
|
148
|
+
|
|
149
|
+
```csharp
|
|
150
|
+
// 註冊服務
|
|
151
|
+
services.Configure<ForwardedHeadersOptions>(options =>
|
|
152
|
+
{
|
|
153
|
+
options.ForwardedHeaders = ForwardedHeaders.All;
|
|
154
|
+
options.KnownNetworks.Clear();
|
|
155
|
+
options.KnownProxies.Clear();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// 中介軟體(確保第一個註冊)
|
|
159
|
+
app.UseForwardedHeaders(); // 無需參數
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 5.2.3.6 設定回應標頭 Token
|
|
163
|
+
|
|
164
|
+
```csharp
|
|
165
|
+
httpContext.SetTokensOfResponseHeaders("token", "重新整理token");
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 5.2.4 讀取 Body 內容(重複讀取)
|
|
171
|
+
|
|
172
|
+
> **版本說明**:僅限 Furion 4.7.9+ 版本使用。
|
|
173
|
+
|
|
174
|
+
預設情況下,ASP.NET Core 不支援重複讀取 Body 內容,Furion 框架提供了擴充方法,需要按照以下步驟操作:
|
|
175
|
+
|
|
176
|
+
### 步驟一:啟用 Body 重複讀取功能
|
|
177
|
+
|
|
178
|
+
**.NET5 版本:**
|
|
179
|
+
|
|
180
|
+
```csharp
|
|
181
|
+
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
|
182
|
+
{
|
|
183
|
+
// ...
|
|
184
|
+
app.EnableBuffering();
|
|
185
|
+
app.UseRouting();
|
|
186
|
+
// ....
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**.NET6+ 版本:**
|
|
191
|
+
|
|
192
|
+
```csharp
|
|
193
|
+
var builder = WebApplication.CreateBuilder(args).Inject();
|
|
194
|
+
// ...
|
|
195
|
+
var app = builder.Build();
|
|
196
|
+
// ...
|
|
197
|
+
app.UseInject();
|
|
198
|
+
|
|
199
|
+
app.EnableBuffering();
|
|
200
|
+
app.MapControllers();
|
|
201
|
+
|
|
202
|
+
app.Run();
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
> ⚠️ `app.EnableBuffering()` 必須在 `app.UseRouting()` 或 `app.MapControllers()` 之前註冊。
|
|
206
|
+
|
|
207
|
+
### 步驟二:使用擴充方法讀取
|
|
208
|
+
|
|
209
|
+
```csharp
|
|
210
|
+
// HttpContext 擴充
|
|
211
|
+
var body = await httpContext.ReadBodyContentAsync();
|
|
212
|
+
|
|
213
|
+
// HttpRequest 擴充
|
|
214
|
+
var body = await httpContext.Request.ReadBodyContentAsync();
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
> **特別注意**:如果使用了 `AddJsonOptions` 或 `AddNewtonsoftJson` 序列化服務,請確保它們在 `.AddInjectXXX` 之前註冊。
|