ASP.Net Core WebApi - 存储来自 ActionFilter 的值以在控制器中访问

Kje*_*sen 2 asp.net-core-mvc asp.net-core asp.net-core-webapi

在 ASP.Net Core WebApp 中,我想使用 ActionFilter 并将信息从 ActionFilter 发送到它所应用的控制器。

多维控制器

对于 MVC 我可以这样做

动作过滤器

    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) { }
    }
Run Code Online (Sandbox Code Playgroud)

控制器

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

它可以工作,我可以通过 ViewData 将数据传递回控制器 - 太棒了。

网络API

我想对 WebApi 控制器做同样的事情。

actionFilter 本身可以应用、运行等 - 但我无法写入 ViewData,因为 WebAPI 继承自 ControllerBase - 而不是从 Controller (如 MVC)继承。

问题

与 MVC 类似,如何将 ActionFilter 中的数据推送回调用的 ControllerBase?

笔记

  • 正在使用 ASP.Net Core 2.2,但如果解决方案不能在所有 .Net Core 中使用,我会感到惊讶。

Kje*_*sen 5

...所以当我快写完问题时我找到了答案,所以这里...

答案是 HttpContext.Items 集合

动作过滤器

    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) { }
    }
Run Code Online (Sandbox Code Playgroud)

控制器

    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();
        }
    }
Run Code Online (Sandbox Code Playgroud)