• 第16章 过滤器


    ----------------------------------------------

    :ActionFilterAttribute类既实现了IActionFilter,也实现IResultFilter接口。是一个抽象类,要求你必须提供一个实现(派生类)。

      而 AuthorizeAttibute和HandleErrorAttribute,则包含了一些有用的特性,并且可以不必创建派生类进行使用。

    :如果为控制器定义了一个自定义基类,那么运用于基类上的任何过滤器都会影响其派生类。

    :在使用HandleError过滤器是会有一个奇怪的行为:视图中必须包含Model.Exception.StackTrace属性的值,

    否则视图便不会显示给用户。一般Model.Exception.StackTrace放在Div中,CSS的display=none。

        <div style="display:none">

        @Model.exception:StrackTrace

        </div>

     ----------------------------------------------

    一、使用过滤器

      1.过滤器:把附加逻辑注入到MVC框架的请求处理。是.NET的注解属性(Attribute),对请求处理管道添加了额外的步骤。

      2.注解属性:派生于System.Attribute的特殊的.NET类。可以附加到其他代码元素(类、方法、属性、字段等)上。

      目的是把附加信息嵌入到已编译的代码中,以便在运行时读回信息。

      在C#中注解属性以Atttibute结尾,用方括号[]进行附加,可以用已命名参数语法给它们的属性(public)赋值,

      在使用注解属性时,尾部的Attibute是省略的:AuthorizeAttibute->[Authorize]

      3.交叉关注:可以用于整个应用程序,而又不适合旋转在某个局部位置的功能,否则会打破关注分离模式(登录、授权、缓存等)。

    MVC框架的过滤器类型

    过滤器类型 接口 默认实现 描述
    Authorization(认证) IAuthorizationFilter AuthorizeAttibute 最先运行,在任何其它过滤器或动作方法之前
    Action(动作) IActionFilter ActionFilterAttribute 在动作方法之前及之后运行
    Result(结果) IResultFilter ActionFiterAttribute 在动作结果被执行之前和之后运行
    Exception(异常) IExceptionFiter HandleErrorAttribute 仅在另一个过滤器、动作方法、或动作结果抛出异常时运行

      4.内建授权过滤器:(AuthorizeAttribute)

        (1)属性 Users:string 一个逗号分隔的用户名列表,允许这些用户访问该动作方法

         (2)属性 Roles:string 一个逗号分隔的角色列表。为了访问该动作方法,用户必须至少是这些角色之一

      5.异常过滤器:(HandleErrorAttribute)

        (1)异常过滤器的主要应用:1.对异常进行日志,2.将适当的消息显示给用户。

        ExceptionContext属性

    名称 类型 描述
    Controller ControllerBase 返回请求的控制器对象
    HttpContext HttpContextBase 提供对请求细节的访问,以及对响应的访问
    IsChildAction bool 子动作判断
    RequestContext RequestContext 提供HttpContext和路由数据的访问
    RouteData RouteData 返回请求的路由数据

      ExceptionContext额外的属性

    名称 类型 描述
    ActionDescriptor ActionDescriptor 提供动作方法的细节
    Result ActionResult 用于动作方法的结果
    Exception Exception 未处理异常
    ExceptionHandled bool 如果别的过滤器已经把这个异常标记为“已处理”,则返回true

      

      HandleErrorAttribute属性

    名称 类型 描述
    ExceptionType Type 由过滤器处理的异常类型。它也处理通过给定值继承而来的异常类型,但会忽略所有其他类型。默认为System.Exception,默认处理所有标准异常
    View string 该过滤器渲染的视图名。默认是Error。默认渲染/View/<cuttentControllerName>/Error.html或/View/Shared/Error.htm
    Master string 在渲染这个过滤器的视图时所使用的布局名称。默认布局页面

        (2)使用内建异常过滤器要在Web.config中〈system.web〉节点中〈pages〉节点之后增加

           /pages〉〈customErrors mode="on" defaultRedirect="/Content/RangeErrorPage.html" /〉〈/system.web〉

       mode:默认是RemoteOnly,指在开发期间,HandleErrorAttribute将不会拦截异常,只是部署之后,并从另一台电脑发出请求时,才生效。

       deaultRedirect:指定一个内容页面,在其他情况下都无法显示异常消息时,便使用该页面。

          [HandleError(ExceptionType=typeof(ArgumentOutOfRangeException),View="RangeError)] 

       HandleErrorAttribute 过滤器会传递一个HandleErrorInfo  

    HandleErrorInfo属性

    名称 类型 描述
    ActionName string 生成异常的动作方法名称
    ControllerName string 生成异常的控制器名称
    Exception Exception 此异常

      6.动作过滤器:(IAactionFilter接口) 

        OnActionExecuting:动作方法执行之前调用。

                  作用:检测请求,取消请求,修改请求,启动一些跨越动作调用期间的活动

                参数:ActionExecutingContext对象,继承自ControllerContext类。

    ActionExecutingContext属性

    名称 类型 描述
    ActionDescriptor ActionDescriptor 提供动作方法的细节
    Result ActionResult 动作方法的结果;通过将该属性设置为非空值,过滤器可以取消该请求

        OnActionExcuted:动作方法执行之后调用 。

               作用:启动一些跨越动作调用期间的活动

               参数:ActionExecutedContext对象。

    ActionExecutedContext属性

    名称 类型 描述
    ActionDescriptor ActionDescriptor 提供动作方法的细节
    Canceled bool 如果该动作已经被另一个过滤器取消,则为true
    Exception Exception 返回由另一个过滤器或动作方法抛出的异常
    ExceptionHandle bool 如果异常已经被处理,则为true
    Result ActionResult 动作方法的结果;通过将该属性设置为非空值,过滤器可以取消该请求

            另一个过滤器通过对Result属性设置一个值的方法来取消此请求.

               从OnActionExecuting方法被调用开始,Canceled就返回true,OnActionExecuted方法仍然会调用,只不过是为了清理和释放资源。

      7.结果过滤器:(IResultFilter接口) 

        OnResultExecuting:在动作方法返回动作结果之时,在执行该动作结果之前,调用OnResultExecuting方法。

              参数:ResultExecutingContext对象。

        OnResultExecuted:在动作方法返回动作结果之时,在执行该动作结果之后,调用OnResultExecuted方法。

              参数:ResultExecutedContext对象。

      8.内建的动作过滤器和结果过滤器(ActionFilterAttribute)

        四个方法:OnActionExecuting、OnActionExecuted、OnResultExecuting、OnResultExecuted。

      9.其他过滤器特性:

        (1)无注解属性过滤:重写On****方法,(不建议使用)

        (2)全局过滤器:App_Start/FilterConfig.cs中定义RegisterGlobalFilters方法(过滤器完成类名)

        (3)过滤器的执行排序:(默认)授权->动作->结果。

            使用过滤器的Order属性进行排序,升序(最小先执行)执行。默认是-1,最先执行。

            全局过滤器->类过滤器->方法过滤器。

         注:异常过滤器的执行顺序是倒过来的:全局过滤器<-类过滤器<-方法过滤器。 

      10.内建过滤器:

        

    过滤器 描述
    RequireHttps 强迫对动作使用HTTPS协议
    OutputCache 缓存一个动作方法的输出

    ValidateInputand

    ValidationAntiForgeryToken

    与安全性相关的授权过滤器

    AsyncTimeout

    NoAsyncTimeout

    用于异步控制器
    ChildActionOnlyAttribute 一个支持Html.Action和Html.RanderAction辅助器方法的授权过滤器

     OutputCache过滤器的参数

    参数 类型 描述
    Duration int 必须,指定维持输出缓存的时间(秒)
    VaryByParam string(逗号分隔列表)

    为每个与这些名称匹配的Request.QueryString和Request.Form值的结合使用不同的缓存条目:默认none表示“不随查询字符串或表值而变”;

    “*”表示“随查询字符串或表值而变”

    VaryByHeader string(逗号分隔列表) 为每个在这些HTTP报头名称中发送的组合值使用不同的缓存条目
    VaryByCustom string 调用Global.asax中的GetVaryByCustomString访求,以这个任意字符串值作为参数进行传递,生成自己的缓存键值(不同浏览器(版本)使用不同的缓存机制)
    VaryByContentEncoding string(逗号分隔列表) 对每个内容编码(Gzip、deflate等文件压缩的编码横笔)创建独立的缓存条目,内容编码可能是由浏览器请求的(下载文件时)
    Location OutputCacheLocation

    枚举值,输出缓存的地方:

    Server-服务器内存中;

    Client-客户端内存中;

    DownStream-客户端浏览器或HTTP缓存的中间设备中;

    ServerAndClient-组合;

    Any(默认)-Server和DownStream组合;

    None-不缓存。

    NoStore bool 只用于保护十分敏感的数据。true表示发送一个Cach-Control:no-store(不存储)报头给浏览器,指定浏览器缓存页面的时间小于显示它的时间。
    CacheProfile string Web.config中<outputCacheSettings>特定小节中缓存设置
    SqlDependency string 格式:“数据库/表名”对。数据库中数据变化后,缓存数据自动过期。(缓存依赖性特性,设置复杂)

        提示:在缓存开始之前,可能要对页面做一次额外的刷新,第一次启动时,会对视图进行编译。

          

      

  • 相关阅读:
    Java实现微生物增殖
    HttpClient学习整理
    在Eclipse中使用JUnit4进行单元测试(初级篇)
    http post提交数组
    postman测试post请求参数为json类型
    【springmvc】传值的几种方式&&postman接口测试
    postman的使用方法详解!最全面的教程
    Gson 使用总结 高级用法
    各个JSON技术的比较(Jackson,Gson,Fastjson)的对比
    Session保存用户名到Session域对象中
  • 原文地址:https://www.cnblogs.com/wjs5943283/p/4644083.html
Copyright © 2020-2023  润新知