我正在编写一些中间件,需要知道当前操作方法(如果有的话)是否具有特定的过滤器属性,以便我可以根据其存在更改行为。所以,在实现IResourceFilter时,是否可以像在ResourceExecutingContext上做的那样获取类型为IList的过滤器集合呢?
今天这样做确实不可能。
在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采用了一种新的路由方法,其中每个操作都是一个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:不确定它是否适用于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();
}
IsDefined()
函数,但可以使用以下代码:if (filterContext.Filters.Any(x => filters.Contains(typeof(AnotherFilter)));)
{ // 要执行的操作... } - infografnet