Каков наилучший способ передачи пользовательской информации в заголовке запроса в класс хранилища в .net core Api - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть угловой проект .net Core Web API.Я отправляю JWT в каждом запросе.Моя цель - регистрировать каждую операцию базы данных.Я могу взять UserInfo из заголовка запроса контроллера.Но я должен взять UserInfo из DbContext.Из-за создания автоматического журнала в классе DbContext.Но я не могу получить доступ.Я думаю, что решение как, создать глобальный фильтр действий для всех действий.А в фильтре действий при запуске действия установите для Session значение UserInfo.И DbContext берет UserInfo из сессии.И когда действие закончено, удалите сессию.Но я думаю, это очень плохое решение.Потому что создаем сессию для каждого запроса.Каков наилучший способ ведения журнала работы базы данных для веб-API .net Core?

public class LogAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Session["UserInfo"] = null;      
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Session["UserInfo"] = HttpContext.RequestHeader["Authorization"];
    }
}

1 Ответ

0 голосов
/ 17 сентября 2018

DbContext имеет внутреннего поставщика услуг.Вам нужно будет добавить две вещи к вашему Startup.cs:

services.AddHttpContextAccessor();

services.AddDbContext(o => o
    .UseSqlServer(...) // or whatever
    .UseInternalServiceProvder());

Затем вы можете переопределить что-то вроде SaveChangesAsync для ведения журнала.Чтобы получить доступ к пользователю:

var httpContextAccessor = GetService<IHttpContextAccessor>();
var principal = httpContextAccessor?.HttpContext.User;

Имейте в виду, что, поскольку DbContext может использоваться вне запроса, httpContextAccessor может быть нулевым.Вот почему нулевой условный оператор используется выше.Это, однако, означает, что principal также может быть нулевым.

...