РЕДАКТИРОВАТЬ Резюме
У меня есть фоновая служба, для которой требуется DBContext, мой DbContext зависит от HttPContext, потому что он использует UserClaims для фильтрации контекста. HttpContext, который является нулевым при запросе DbContext от BackgroundService (это сделано из-за отсутствия WebRequest, связанного с BackgroundService).
Как я могу перехватить и записать HTTPContext, чтобы мои заявления пользователей перенесли на фоновую службу?
Я пишу размещенный сервис, чтобы помещать в очередь посылку сообщений из моих концентраторов в Signalr. Мой фон.
public interface IBackgroundTaskQueue
{
void QueueBackgroundWorkItem(Func<IServiceProvider, CancellationToken, Task> workItem);
Task<Func<IServiceProvider, CancellationToken, Task>> DequeueAsync(CancellationToken cancellationToken);
}
public class BackgroundTaskQueue : IBackgroundTaskQueue
{
private ConcurrentQueue<Func<IServiceProvider, CancellationToken, Task>> _workItems = new ConcurrentQueue<Func<IServiceProvider, CancellationToken, Task>>();
private SemaphoreSlim _signal = new SemaphoreSlim(0);
public void QueueBackgroundWorkItem(Func<IServiceProvider, CancellationToken, Task> workItem)
{
if (workItem == null)
{
throw new ArgumentNullException(nameof(workItem));
}
this._workItems.Enqueue(workItem);
this._signal.Release();
}
public async Task<Func<IServiceProvider, CancellationToken, Task>> DequeueAsync(
CancellationToken cancellationToken)
{
await this._signal.WaitAsync(cancellationToken);
this._workItems.TryDequeue(out var workItem);
return workItem;
}
}
Я работаю с очередями, которым требуется мой DbContext, My Db Context автоматически фильтрует данные на основе зарегистрированного пользователя, поэтому ему требуется доступ к HTTPContextAccessor.
Когда я ставлю в очередь элемент, для которого требуется мой DbContext, я получаю сообщение об ошибке, что HTTPContext имеет значение null, что имеет смысл, потому что я работаю в фоновом процессе.
var backgroundTask = sp.GetRequiredService<IBackgroundTaskQueue>();
backgroundTask.QueueBackgroundWorkItem((isp, ct) => {
//When this line is executed on the background task it throws
var context = sp.GetService<CustomDbContext>();
//... Do work with context
});
Мой DBContext использует HTTPContextAccessor для фильтрации данных:
public CustomDbContext(DbContextOptions options, IHttpContextAccessor httpContextAccessor)
{
}
Есть ли способ, которым я могу захватить HTTPContext с каждой задачей, или, возможно, Moq один и захватить UserClaims, и заменить их в области действия для BackgroundService?
Как я могу использовать службы, зависящие от HTTPContext, от моих фоновых служб.