Проблема с классом, имеющим в качестве базового класса ActionFilterAttribute

Следующий класс создает настраиваемый фильтр действий с именем [SessionTimeout]:

public class SessionTimeoutAttribute : ActionFilterAttribute
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly ISession _session;
    public SessionTimeoutAttribute(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
        _session = _httpContextAccessor.HttpContext.Session;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = _httpContextAccessor.HttpContext;
        if (!ctx.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new RedirectResult("~/Account/Login");
            return;
        }
        base.OnActionExecuting(filterContext);
    }
}

Как сейчас реализовано, когда я иду украшать класс с помощью [SessionTimeout], он также запрашивает у меня параметр для конструктора.

Я хотел бы избежать этого, если это возможно.

Кто-нибудь может помочь мне? Спасибо.


person Simone Spagna    schedule 15.11.2019    source источник
comment
это похоже на то, что должно быть встроено.   -  person Daniel A. White    schedule 16.11.2019
comment
httpcontext также должен быть доступен из filterContext.   -  person Daniel A. White    schedule 16.11.2019
comment
@DanielA.White: По сути, что мне нужно сделать, чтобы иметь возможность квалифицировать класс с помощью атрибута [SessionTimeout] без передачи httpcontext? Не могли бы вы объяснить мне с образцом? Спасибо.   -  person Simone Spagna    schedule 16.11.2019


Ответы (1)


HttpContext является свойством объекта ActionExecutingContext, поэтому вам не нужно передавать его через конструктор. Что-то вроде этого должно работать (примечание: это не проверено).

public class SessionTimeoutAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = filterContext.HttpContext;
        if (!ctx.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new RedirectResult("~/Account/Login");
            return;
        }
        base.OnActionExecuting(filterContext);
    }
}
person howcheng    schedule 15.11.2019
comment
Cajn вы посмотрите на эту тему? stackoverflow.com/questions/58879140/ - person Simone Spagna; 16.11.2019