如何从HttpContext获取ASP.NET Core MVC过滤器

时间:2017-09-05 16:15:40

标签: c# asp.net-core asp.net-core-mvc httpcontext asp.net-core-middleware

我正在尝试编写一些中间件,并且需要知道当前的操作方法(如果有的话)是否具有特定的过滤器属性,因此我可以根据它的存在来改变行为。

因此,当您实施IList<IFilterMetadata>时,可以像ResourceExecutingContext那样获得IResourceFilter类型的过滤器集合吗?

3 个答案:

答案 0 :(得分:4)

今天真的不可能。

答案 1 :(得分:3)

ASP.NET Core 3.0使用新的路由,每个动作都是Endpoint,并且动作和控制器上的所有属性都位于Metadata上。

这是您的操作方式。

app.UseRouting();


app.Use(async (context, next) =>
{
    Endpoint endpoint = context.GetEndpoint();

    YourFilterAttribute filter = endpoint.Metadata.GetMetadata<YourFilterAttribute>();

    if (filter != null)
    { 

    }

    await next();
});


app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

答案 2 :(得分:0)

注意:并非真正直接回答您的问题,但可能会根据您的需求提供帮助(并且代码的评论时间太长)

注意2:不确定它是否适用于Core,如果没有,请告诉我并删除答案

您可以在过滤器中知道是否使用了另一个过滤器:

public class OneFilter : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Check if the Attribute "AnotherFilter" is used
        if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherFilter), true) || filterContext.Controller.GetType().IsDefined(typeof(AnotherFilter), true))
        {
            // things to do if the filter is used

        }
    }
}

public class AnotherFilter : ActionFilterAttribute, IActionFilter
{
   // filter things
}

和/或

您可以在路线数据中放入一些数据,以了解使用过滤器的操作:

void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
    filterContext.RouteData.Values.Add("OneFilterUsed", "true");
    base.OnActionExecuting(filterContext);
}

...

public ActionResult Index()
{
    if(RouteData.Values["OneFilterUsed"] == "true")
    {

    }

    return View();
}