[英]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.