ASP. Net Core WebApi - сохранение значений из ActionFilter для доступа в контроллере - PullRequest
0 голосов
/ 05 февраля 2020

В ASP. Net Core WebApp я хочу использовать ActionFilter и отправлять информацию из ActionFilter на контроллер, к которому он применяется.

MVC

Для MVC Я могу сделать это

ActionFilter

    public class TenantActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //Using some sneaky logic to determine current tenant from domain, not important for this example
            int tenantId = 1;
            Controller controller = (Controller)context.Controller;
            controller.ViewData["TenantId"] = tenantId;
        }
        public void OnActionExecuted(ActionExecutedContext context) { }
    }

Контроллер

    public class TestController : Controller
    {
        [ServiceFilter(typeof(TenantActionFilter))]
        public IActionResult Index()
        {
            int tenantId = ViewData["TenantId"];
            return View(tenantId);
        }
    }

Это работает, и я могу передать данные обратно в контроллер через ViewData - отлично.

WebApi

Я хочу сделать то же самое для контроллеров WebApi.

Можно применить сам actionFilter , работает et c - но я не могу записать в ViewData, потому что WebAPI наследуется от ControllerBase, а не от Controller (как MVC).

Вопрос

Как я могу pu sh данные из моего ActionFilter обратно в вызывающую ControllerBase, аналогично MVC?

Notes

  • ASP. Net Core 2.2 используется, но я был бы удивлен, если бы решение не может быть использовано во всех. Net Core.

1 Ответ

0 голосов
/ 05 февраля 2020

... Итак, я нашел ответ, когда почти закончил писать вопрос, вот так ...

Ответ - коллекция HttpContext.Items

ActionFilter

    public class TenantActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            int tenantId = 1;
            var controller = (ControllerBase)context.Controller;
            controller.HttpContext.Items.Add("TenantId", tenantId);
        }
        public void OnActionExecuted(ActionExecutedContext context) { }
    }

Контроллер

    public class TestApiController : ControllerBase
    {
        [ServiceFilter(typeof(TenantActionFilter))]
        public SomeClass Get()
        {
            int tenantId;
            if (!int.TryParse(HttpContext.Items["TenantId"].ToString(), out tenantId))
            {
                tenantId = -1;
            }
            return new SomeClass();
        }
    }
...