网站开发公司vue框架,阳江招聘网站大全,网络营销产品推广方案,查询商标是否已注册官网过滤器的作用是在 Action 方法执行前或执行后做一些加工处理。使用过滤器可以避免Action方法的重复代码#xff0c;例如#xff0c;您可以使用异常过滤器合并异常处理的代码。
过滤器如何工作#xff1f;
过滤器在 MVC Action 调用管道中运行#xff0c;有时称为过滤器管…过滤器的作用是在 Action 方法执行前或执行后做一些加工处理。使用过滤器可以避免Action方法的重复代码例如您可以使用异常过滤器合并异常处理的代码。
过滤器如何工作
过滤器在 MVC Action 调用管道中运行有时称为过滤器管道。MVC选择要执行的Action方法后才会执行过滤器管道 实现
过滤器同时支持同步和异步两种不同的接口定义。您可以根据执行的任务类型选择同步或异步实现。
同步过滤器定义OnStageExecuting和OnStageExecuted方法会在管道特定阶段之前和之后运行代码的。例如IActionFilter过滤器在调用Action方法之前调用OnActionExecuting在Action方法之回之后调用OnActionExecuted public class SampleActionFilter : IActionFilter{ public void OnActionExecuting(ActionExecutingContext context) { // do something before the action executes} public void OnActionExecuted(ActionExecutedContext context) { // do something after the action executes}}
异步过滤器定义了一个OnStageExecutionAsync方法。该方法提供了FilterTypeExecutionDelegate的委托当调用该委托时会执行具体管道阶段的工作。例如ActionExecutionDelegate用于调用Action方法您可以在调用它之前和之后执行代码。 public class SampleAsyncActionFilter : IAsyncActionFilter{ public async Task OnActionExecutionAsync( ActionExecutingContext context, ActionExecutionDelegate next) { // do something before the action executesawait next(); // do something after the action executes}}
您可以在单个类中实现多个过滤器接口。例如ActionFilterAttribute抽象类实现了IActionFilter和IResultFilter以及与它们对应的异步接口。 提示您不需要同时实现两种过滤器接口要么是同步的要么是异步的。框架首先检查过滤器是否实现了异步接口如果是直接执行异步方法。如果不是它会执行同步接口的方法。如果在一个类上同时实现两种接口则只会调用异步方法。当使用像ActionFilterAttribute这类抽象类时您只需要覆盖过滤器的同步方法或异步方法。 过滤器类型
ASP.NET Core 有以下五种类型的过滤器每个过滤器类型在过滤器管道中的不同阶段执行
Authorization Filter授权过滤器 在过滤器管道中第一个执行通常用于验证当前请求的合法性不合法后面的管道会直接跳过。它们只有一个Before方法不像其它大多数过滤器支持前置阶段方法和后置阶段方法。注意您不要在授权过滤器中抛出异常因为没有任何代码来处理异常异常过滤器不处理它们。Resource Filter资源过滤器是第二个运行在 Authorization Filter 之后Model Binding 之前执行。在性能方面资源过滤器在实现缓存或截断过滤器管道尤为重要。Action Filter使用率最高的过滤器在调用 Acioin 方法之前和之后执行代码。跟 Resource Filter 很类似但 Model Binding 在之后执行。Exception Filter用于为应用程序执行异常处理策略。Result Filter当 Action 执行完成后最后会执行过滤器。用于处理ActionResult结果输出策略。 过滤器运行顺序
ASP.NET Core 的每个请求都会先经过已注册的Middleware接着才会执行过滤器同类型的过滤器都会以先进后出的方式执行。 图片来自 John Wu 的博客 黃色箭头是正常情況流程灰色箭头是异常处理流程 过滤器的作用域与执行顺序
过滤器具有三种不同级别的作用域。您可以通过Attribute将过滤器注册到指定控制器或 Action 方法您也可以在Startup类的ConfigureServices方法中将过滤器注册到MvcOptions.Filters的集合中作为全局过滤器对所有的控制器和Action方法均有效 public class Startup{ public void ConfigureServices(IServiceCollection services) {services.AddMvc(options {options.Filters.Add(new AddHeaderAttribute(GlobalAddHeader, Result filter added to MvcOptions.Filters)); // an instanceoptions.Filters.Add(typeof(SampleActionFilter)); // by typeoptions.Filters.Add(new SampleGlobalActionFilter()); // an instance});services.AddScopedAddHeaderFilterWithDi();}}
示例来自于ASP.NET Core MVC 英语文档
默认执行顺序
当管道的某个阶段存在多个过滤器时过滤器执行的默认顺序由作用域确定全局过滤器优先于控制器过滤器控制器过滤器优先于Action方法过滤器。以下示例是同步 Action 过滤器调用的顺序
序号过滤器作用域过滤器方法1GlobalOnActionExecuting2ControllerOnActionExecuting3MethodOnActionExecuting4MethodOnActionExecuted5ControllerOnActionExecuted6GlobalOnActionExecuted 提示每个控制器的基类Controller包含OnActionExecuting和OnActionExecuted方法。其中OnActionExecuting在所有过滤器之前调用OnActionExecuted在所有过滤器之后调用。 覆盖默认执行顺序
您可以通过实现IOrderedFilter接口来覆盖默认的执行顺序。此接口公开了Order属性表示优先级以确定执行顺序具有较低Order值的过滤器将在具有较高Order值的过滤器之前执行前置方法具有较低Order值的过滤器将在具有较高Order值的过滤器之后执行后置方法。您可以使用构造函数参数设置Order属性
[MyFilter(Name Controller Level Attribute, Order1)]
如果您将上述示例中 Action 过滤器的Order设置为1将控制器和全局过滤器的Order属性分别设置为2和3则执行顺序将与默认相反。
序号过滤器作用域Order 属性过滤器方法1Method1OnActionExecuting2Controller2OnActionExecuting3Global3OnActionExecuting4Global3OnActionExecuted5Controller2OnActionExecuted6Method1OnActionExecuted
过滤器执行时Order属性的优先级高于作用域。过滤器首先按Order属性排序然后再按作用域排序。所有内置过滤器实现IOrderedFilter接口并将Order值默认设置为0因此除非设置Order属性为非零值否则按作用域的优先级执行。
总结
今天我们已经了解了关于过滤器基本知识在下一篇博客中我们将介绍内置过滤器、过滤的使用、依赖注入、取消与截断等知识谢谢
参考资料
https://blog.johnwu.cc/article/asp-net-core-filters.htmlhttps://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters
原文地址http://www.cnblogs.com/tdfblog/p/filters-in-aspnet-core-mvc.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注