#asp.net
Вопрос:
В настоящее время я внедряю фоновую службу в веб-приложении, в которой эти службы получили реализацию метода, для которого требуется получить текущий идентификатор пользователя, вошедшего в систему.
я пытаюсь получить доступ к текущему вошедшему в систему пользователю, но выполнение этого вызова, очевидно, извне контроллера, вызывает ошибку со следующим сообщением = «Ссылка на объект не установлена для экземпляра объекта».
public class ScopedProcessingService: IScopedProcessingService
{
private readonly ILogger<ScopedProcessingService> logger;
private readonly IEweUserManager eweUserManager;
private IHttpContextAccessor _contextAccessor;
public ScopedProcessingService(IEweUserManager eweUserManager,
ILogger<ScopedProcessingService> logger, IHttpContextAccessor contextAccessor)
{
this.logger = logger;
this.eweUserManager = eweUserManager;
_contextAccessor = contextAccessor;
}
public async Task DoWork(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken);
var userId = _contextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
/* i am getting the error in this line */
if (!string.IsNullOrEmpty(userId))
{
var result = await eweUserManager.FindAsync(userId);
if (result.IsSuccess)
{
.. the rest of the code
}
}
}
catch(Exception ex)
{
logger.LogError(ex, ex.Message);
}
}
}
}
Комментарии:
1. Если вы выполняете фоновую службу, HttpContext отсутствует, поэтому целесообразно использовать IHttpContextAccessor. Что именно вы делаете с этой услугой? Чего вы пытаетесь достичь и что должно инициировать этот процесс?
2. основная цель этой фоновой службы-передавать текущий идентификатор пользователя каждые 10 секунд, пока пользователь входит в систему с помощью метода WCF, который затем реализует другие методы
3. есть ли что-нибудь, что может помочь мне получить текущий идентификатор пользователя, вошедшего в систему, в этой фоновой службе ?
4. Это, вероятно, было бы чем-то, что вам пришлось бы начинать с HttpContext. Оттуда вы можете вызвать службу WCF или, возможно, добавить запись в какую-либо очередь, а затем попросить фоновую службу забрать идентификатор пользователя из очереди и отправить его в службу WCF. Но давайте вернемся еще дальше: какова на самом деле цель этого? Вы просто пытаетесь отследить, когда пользователь находится на вашем сайте? Если бы я был нетехническим человеком, как бы вы описали цель того, что вы пытаетесь сделать?
5. есть ли способ запустить службу, например, из домашнего контроллера, который поможет мне вызвать службу для запуска, а также я могу передать идентификатор пользователя