我有一个CorrelationIdMiddleware
,它正在检查传入的请求标头,并设置一个范围为CorrelationId
的范围,以后再传播到所有HttpClients
。
public class CorrelationId {
public string Value { get;set; }
}
public void ConfigureServices(IServiceCollection services) {
...
services.AddScoped<CorrelationId>();
...
}
我遇到了一个用例,我需要围绕一段代码创建一个隔离的作用域,但是希望将CorrelationId
从http请求的作用域传播到隔离的作用域(隔离的作用域有一个HttpClient
,我想附加相同的标题)。
我想生成一个由DI创建的后台任务,它带有任何必需的依赖关系,并且对于任何HttpClient都通过HttpClientFactory插件注入了标头。
public Controller {
public Controller(IServiceProvider serviceProvider, CorrelationId correlationId) { ... }
public IActionResult PostTask() {
var isolatedScope = _serviceProvider.CreateScope();
var action = () => {
using(isolatedScope) {
var backgroundJob = isolatedScope
.ServiceProvider
.GetRequiredService<IBackgroundJob>();
backgroundJob.Execute();
// scopedCorrelationId =/= correlationId
// how can i get correlationId to jump scopes?
}
};
return Task.Factory.StartNew(
action,
CancellationToken.None,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
}
}
是否可以将某些对象转移到隔离范围中?理想情况下,无需知道typeof(object)
我就需要转移。
答案 0 :(得分:0)
不可能在父范围和隔离范围之间传输对象。
如果信息CorrelationId
与请求的标头一起到达,则更适合HttpContext
或AsyncLocal
变量(如果需要通过异步执行流进行传播的话)。