簡體   English   中英

自定義中間件以從 HttpClient 響應中注入標頭

[英]Custom middleware to inject headers from HttpClient response

我正在構建一種 API 網關。
用戶向我的 API 發送數據,我向內部服務器詢問一些數據,然后我將其發回給用戶。 我的問題是我應該從我的 HttpClient 響應中獲取一些標頭並將其發送回客戶端,這很簡單,例如:

var response = await _httpClient.Client.GetAsync($"route" + query);
var responseBodyAsJson = HttpClientHelper.ExtractGenericJsonDocument(await response.Content.ReadAsStringAsync());
var cache = HttpClientHelper.ExtractCacheControl(response.Headers.CacheControl.ToString());
HttpContext.Response.Headers.Add(cache);
return responseBody;

這已經工作了,我刪除了 json 響應被修改的部分,並讀取了其他一些標頭。
但是現在有 10 個控制器路由,以后會添加更多。 我不想一直寫所有的東西,而且將來有人可能會改變它而忘記標題。

我試圖做一個這樣的中間件:

public async Task InvokeAsync(HttpContext context)
{
string cacheHeader = context.Request.Headers.TryGetValue("cache-control", out var values) ? values.FirstOrDefault() : null;
var cache = HttpClientHelper.ExtractCacheControl(cacheHeader);
context.Response.Headers.Add(cache);
await _next(context);
}

但是他們我意識到中間件可以訪問的上下文是我手動注入標頭的上下文。

那么,有沒有辦法讀取 HttpClient 上下文響應並將其寫入整個應用程序/路徑/控制器的 API 響應?

好吧,可能是我表達不正確,但是中間件的想法並沒有奏效,甚至改了_next position。 但沒問題,設法以另一種方式做到這一點。

我在我的 HttpClient class 中使用IHttpContextAccessor進行了 DI。 請記住,您需要在啟動時將其添加為 Singleton:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

他們在我的 HttpClient class 中的新公共方法中做了這樣的事情:

_httpContextAccessor.HttpContext.Response.Headers.Add(cache);

最后我的端點結束得更干凈了,比如:

var response = await _httpClient.PrivateGetJsonAndInjectHeader($"route" + query);
return responseBody;

結果並不是真正的“SOLID”,因為我的新 PrivateGetJsonAndInjectHeader 獲取數據,返回數據,還修改了主要的 Context Headers,但仍然更干凈,應該避免任何錯誤。 如果需要,將來也更容易修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM