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

6
我正在编写一些中间件,需要知道当前操作方法(如果有的话)是否具有特定的过滤器属性,以便我可以根据其存在更改行为。所以,在实现IResourceFilter时,是否可以像在ResourceExecutingContext上做的那样获取类型为IList的过滤器集合呢?
3个回答

11

今天这样做确实不可能。

在ASP.NET Core 3.0中是可能的。

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();
});

在ASP.NET Core 3.0中现在是否可以实现这一点?特别是,我有一个来自响应重写中间件的“RewriteContext”。 - Muhammad Rehan Saeed

5

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
这是先前帖子中完全相同的代码(你编辑后包含了它),因此现在是一个重复的答案。 - Mark Schultheiss

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
}

AND/OR

您可以将一些数据放入路由数据中,让操作知道使用了哪些过滤器:

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

...

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

    }

    return View();
}

1
在 .Net Core 的 ActionDescriptor 中不存在 IsDefined。 - Andreas Vendel
2
是的,没有IsDefined()函数,但可以使用以下代码:if (filterContext.Filters.Any(x => filters.Contains(typeof(AnotherFilter)));) { // 要执行的操作... } - infografnet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接