如何从 HttpContext 获取 ASP.NET 核心 MVC 过滤器
How to get ASP.NET Core MVC Filters from HttpContext
我正在尝试编写一些中间件并且需要知道当前操作方法(如果有的话)是否具有特定的过滤器属性,因此我可以根据它的存在来更改行为。
那么,当您实施 IResourceFilter
时,是否可以像在 ResourceExecutingContext
上那样获得类型 IList<IFilterMetadata>
的过滤器集合?
今天真的不行了
在 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();
});
注意:并没有真正直接回答你的问题,但可能会根据你的需要提供帮助(代码太长无法评论)
注意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
你可以在 Route 数据中放一些数据来让 Action 知道使用了哪些 Filters:
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RouteData.Values.Add("OneFilterUsed", "true");
base.OnActionExecuting(filterContext);
}
...
public ActionResult Index()
{
if(RouteData.Values["OneFilterUsed"] == "true")
{
}
return View();
}
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();
});
我正在尝试编写一些中间件并且需要知道当前操作方法(如果有的话)是否具有特定的过滤器属性,因此我可以根据它的存在来更改行为。
那么,当您实施 IResourceFilter
时,是否可以像在 ResourceExecutingContext
上那样获得类型 IList<IFilterMetadata>
的过滤器集合?
今天真的不行了
在 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();
});
注意:并没有真正直接回答你的问题,但可能会根据你的需要提供帮助(代码太长无法评论)
注意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
你可以在 Route 数据中放一些数据来让 Action 知道使用了哪些 Filters:
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RouteData.Values.Add("OneFilterUsed", "true");
base.OnActionExecuting(filterContext);
}
...
public ActionResult Index()
{
if(RouteData.Values["OneFilterUsed"] == "true")
{
}
return View();
}
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();
});