【问题标题】:Custom middleware to inject headers from HttpClient response自定义中间件以从 HttpClient 响应中注入标头
【发布时间】:2021-02-22 20:16:21
【问题描述】:

我正在构建某种 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(context) 并记住将中间件注册 (app.Use) 正确放置在 mvc 中间件之前(app.UseMvc 在 asp.net core 2.2 中)。这样可以确保您的中间件在响应从 mvc 中间件出来后就可以访问它。

标签: c# asp.net asp.net-core middleware


【解决方案1】:

好吧,可能我表达的不正确,但是中间件的想法并没有奏效,甚至改变了_next位置。 但没问题,设法用另一种方式做到了。

我用IHttpContextAccessor 在我的HttpClient 类中做了一个DI。 请记住,您需要在启动时将其添加为单例:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

他们在我的 HttpClient 类中的新公共方法中做了这样的事情:

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

最后我的端点更干净了,比如:

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

结果并不是真正的“SOLID”,因为我的新 PrivateGetJsonAndInjectHeader 获取数据,返回数据,还修改了主要的 Context Headers,但仍然更干净,应该避免任何错误。如果需要,将来也更容易修改。

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多