У меня есть CorrelationIdMiddleware
, который проверяет заголовки входящих запросов и устанавливает область действия CorrelationId
, которая затем распространяется на все HttpClients
.
public class CorrelationId {
public string Value { get;set; }
}
public void ConfigureServices(IServiceCollection services) {
...
services.AddScoped<CorrelationId>();
...
}
Я столкнулся с вариантом использования, где мне нужносоздать изолированную область вокруг части кода, но хотелось бы, чтобы CorrelationId
из области действия http-запроса распространялся в изолированную область (в изолированной области есть HttpClient
, к которому я хотел бы присоединить тот же заголовок).
Я хотел бы создать фоновую задачу, созданную из DI с любыми необходимыми зависимостями и для любых HttpClients, для которых заголовки вводятся через плагины 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)
мне нужно перевести.