IOperationContextProvider来保存有关当前执行上下文的一些信息(称为OperationContext)。对于传出请求,我想配置将相关 ID 添加到传出 HTTP 标头,如下所示:
services.AddHttpClient<IMyClass, MyClass>((serviceProvider, httpClient) =>
{
var contextProvider = serviceProvider.GetRequiredService<IOperationContextProvider>();
var corrId = contextProvider.Context.CorrelationId;
httpClient.DefaultRequestHeaders.Add("x-corr-id", corrId);
});
Run Code Online (Sandbox Code Playgroud)
但是,我无法执行此操作,因为 IHttpClientFactory 为其正在创建的每个处理程序创建范围,并且无法从 HTTP 客户端配置内部访问我的上下文。添加 HTTP 消息处理程序也是如此,它们也是在与处理程序相同的范围内创建的。
官方文档:
为每个处理程序创建
IHttpClientFactory一个单独的 DI 范围。处理程序可以自由依赖任何范围的服务。
有没有办法达到与 HttpClient 本身构建相同的范围?
我只找到了一种方法MyClass,我也注入了HttpClient,我也注入IOperationContextProvider并手动配置,但这HttpClient有点麻烦,因为它需要在任何地方完成:
public MyClass(HttpClient httpClient, IOperationContextProvider contextProvider)
{
var corrId = contextProvider.Context.CorrelationId;
httpClient.DefaultRequestHeaders.Add("x-corr-id", corrId);
this._httpClient = httpClient;
}
Run Code Online (Sandbox Code Playgroud)