跨服务提供商范围传输对象

时间:2019-05-22 08:58:17

标签: asp.net-core .net-core

我有一个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)我就需要转移。

1 个答案:

答案 0 :(得分:0)

不可能在父范围和隔离范围之间传输对象。

如果信息CorrelationId与请求的标头一起到达,则更适合HttpContextAsyncLocal变量(如果需要通过异步执行流进行传播的话)。