Чего я хочу достичь:
Сохранить IP-адрес пользователя, выполняющего определенные действия / контроллеры, в мою базу данных.Кроме того, поскольку этот процесс занимает значительное количество времени, было бы хорошо, если бы он выполнялся в фоновом потоке или подобном.
То, что я пробовал до сих пор:
Создание атрибута CustomAuthorizeAttribute, который выглядит примерно такthis:
public class LoggedAuthorizeAttribute : TypeFilterAttribute
{
public LoggedAuthorizeAttribute() : base(typeof(LoggedAuthorizeFilter))
{
}
}
public class LoggedAuthorizeFilter : IAuthorizationFilter
{
private readonly UserManager<User> _userManager;
public LoggedAuthorizeFilter(UserManager<User> userManager)
{
_userManager = userManager;
}
public async void OnAuthorization(AuthorizationFilterContext context)
{
if (!context.HttpContext.User.Identity.IsAuthenticated)
return;
var user = await _userManager.GetUserAsync(context.HttpContext.User);
var remoteIpAddress = context.HttpContext.Connection.RemoteIpAddress;
user.UserLogins.Add(new UserLogin
{LoggedInOn = DateTimeOffset.UtcNow, LoggedInFrom = remoteIpAddress});
await _userManager.UpdateAsync(user);
}
}
Проблемы с этим решением:
- Когда запрос достигает действия, отмеченного этим атрибутом, запрос займет около 1-2 секундпока он фактически не обработает действие.
- UserManager извлекается с помощью Dependency Injection, но я также обращаюсь к экземпляру UserManager в некоторых моих действиях, что вызывает
InvalidOperationException
сообщение A second operation started on this context before a previous operation completed. This is usually caused by different threads using the same instance of DbContext, however instance members are not guaranteed to be thread safe. This could also be caused by a nested query being evaluated on the client, if this is the case rewrite the query avoiding nested invocations.
.
Любая помощь приветствуется.
Обновление
Как подсказано Kirk Larkin
, реализация IAsyncActionFilter вместо этого исправляет мою вторую проблему, с которой я столкнулся.Но все же, как бы я выполнил это в фоновом потоке или подобном, если это даже правильный выбор.