手机版

Asp中MVC学习总结过滤的详细说明 网

时间:2021-09-05 来源:互联网 编辑:宝哥软件园 浏览:

一、过滤器介绍

1.1.了解什么是过滤器

1.过滤器向请求处理管道注入额外的逻辑。它提供了一种简单而优雅的方式来实现横切关注点。

2.所谓过滤器,MVC框架中的过滤器与请求完全不同。过滤器和响应。ASP.NET平台中的过滤对象,主要实现请求和响应流的传输。通常我们所说的过滤器是指MVC框架中的过滤器。

3.过滤器可以向请求处理管道注入一些代码逻辑,这是基于C#的Attribute的实现。当负责调用Action的类ControllerActionInvoker调用并执行Action时,它将检查Action上的属性,并查看这些属性是否实现了附加代码注入处理的指定接口

1.2.了解为什么使用过滤器

假设你做一个小项目,其中一个功能是操作和管理用户信息模块。有这样一个要求,即用户信息管理必须由经过身份验证的用户来操作。我们可以在每个操作方法中检查身份验证请求,如下所示:

使用MvcFilterDmo。核心;使用系统;使用系统。集合。通用;使用系统。Linq使用系统。Web使用系统。Web . Mvc使用系统。网络安全;命名空间MvcFilterDmo。控制器{公共类HomeController :控制器{公共操作结果索引(){ if(!请求。isaauthenticated){ FormsAuthentication。redirectoneticinpage();}//操作部分.返回视图();}公共操作结果Insert() { if(!请求。isaauthenticated){ FormsAuthentication。redirectoneticinpage();}//操作部分.返回视图();} public ActionResult Update() { if(!请求。isaauthenticated){ FormsAuthentication。redirectoneticinpage();}//操作部分.返回视图();}公共操作结果Delete() { if(!请求。isaauthenticated){ FormsAuthentication。redirectoneticinpage();}//操作部分.返回视图();}//其他Action操作方法//.}}通过上面的代码,我们可以发现用这种方式检查请求认证有很多重复,这也是为什么使用过滤器的原因,可以达到同样的效果。如下图所示:

使用MvcFilterDmo。核心;使用系统;使用系统。集合。通用;使用系统。Linq使用系统。Web使用系统。Web . Mvc使用系统。网络安全;命名空间mvcfilterdmo。控制器{[authorize]public class home controller :控制器{ public action result index(){//操作部分.返回视图();} public ActionResult Insert() {//操作部分.返回视图();} public ActionResult Edit() {//操作部分.返回视图();}公共操作结果Delete() {//操作部分.返回视图();}//其他Action操作方法//.}}过滤器是中的属性。NET,它提供了要添加到请求处理管道中的附加方法。在这里使用Authorize过滤器可以达到同样的效果,但是代码明显比之前更简单,更优雅。

第二,过滤器的使用

2.1、过滤器的基本类型

过滤器实现的机制:在MVC框架调用Action之前,它会检查方法的定义中是否实现了Attributes。如果是这样,由属性定义的方法将在请求处理管道中的适当位置被调用。

ActionFilterAttribute类同时实现了IactionFilter接口和IResultFilter接口。这是一个抽象类,需要您提供一个实现。AuthorizeAttribute和HandleErrorAttribute类包含一些有用的功能,可以在不创建派生类的情况下使用。

2.2、过滤应用、应用模式和执行顺序

应用:过滤器可应用于控制器或动作方法。当应用于控件时,这意味着所有Action方法都有这个过滤器,它们可以混合使用或多次使用,如下所示:

[A] //表示所有Action方法都将应用过滤器A公共类demo controller:controller {[b]//b、过滤器c只对这个Action方法起作用,但也有过滤器a [c]公共动作结果索引(){//操作部分的应用效果.返回视图();}}应用模式:特性的模式,如上代码所示。

执行顺序:同类型的过滤器执行顺序接近方法的第一次执行,不同类型的过滤器一般执行顺序为【authorize-action-action result】。至于异常过滤器,只要抛出异常,它们就会被执行。如果要调整执行顺序,可以通过调整Order方法的值来控制执行顺序。值越小,执行越早。下图是操作/结果过滤器应用程序的执行序列图

(1)同类型过滤器的应用示例:两个用户定义的Action过滤器MyFirstFilter和MyThreeFilter应用于同一个Action方法Index。

三个控制器代码如下:

我的过滤器代码如下:

MyThreeFilter代码如下:

运行结果如下:

(2)不同类型过滤器的应用示例:有一个用户定义的Action过滤器my filter和一个用户定义的Result过滤器MySecondFilter,应用于同一个Action方法Index。

三个控制器代码如下:

我的过滤器代码如下:

我的秒过滤器代码如下:

运行结果如下:

看完上面的解释,你可能不明白这些过滤器的执行顺序以及如何自定义。没关系,我们将逐一介绍这些基本过滤器的使用以及如何定制。

2.3.使用授权过滤器

所有实现IAuthorizationFilter接口的都可以称为授权过滤器:其定义如下:

公共接口IAuthorizationFilter { void on authorization(AuthorizationContext filter context);}由于MVC框架系统中author ize attribute的实现有一些突出的功能,而且这类涉及到安全性的代码一定要谨慎编写,一般我们不会直接实现这个接口,而是继承author ize attribute类并重写其AuthorizeCore方法。当签名为bool authorize core(httpcontext base httpcontext)且授权处理失败时,可以覆盖其handlunauthorizedrequest方法,其签名为void handlunauthorizedrequest(授权上下文上下文)。注意:认证和授权是两回事,认证发生在授权之前。

默认授权过滤器具有验证功能,其验证机制是使用Asp.net平台的验证机制,如表单验证、Windows验证等。除了认证功能,它还有自己的授权功能。授权过滤器是所有过滤器中最早的一个。

当通过Route到达控制器时,在调用Action之前,MVC框架会检测相关Action上是否有授权过滤器,如果有,会调用OnAuthorization方法,如果这个方法批准了请求,会调用对应的Action。

使用授权过滤器的几种情况如下:

1.直接在操作或控制器上添加授权,表示身份验证已启用,但不涉及授权。

2.添加authorize(users=“A,B”)],表示身份验证已启用,授权也已启用,只有A或B用户才能访问此控制器。

3.添加授权(角色=“管理员,成员”)]时,步骤如下:

-当使用ASP.NET附带的角色提供程序时,或者实现您自己的角色提供程序时,您只需要集成角色提供程序类型并实现所有或部分方法,最好是所有方法。

-在Web程序根目录的Web.config文件中配置角色管理器。

-使用相应操作中的角色类型来访问您自己创建的角色提供程序中的相关方法。

使用内置的授权过滤器

AuthorizeAttribute是一个内置在MVC框架中的授权过滤器,它允许我们使用这个类的两个公共属性来指定授权策略,如下所示:

用户和角色处于同一关系中,例如,user=“a,b,c”,Roles=“Admin”,这意味着用户只有是a,b,c和Admin角色之一才能访问。

创建自定义授权过滤器

方法1:直接实现IAuthorizationFilter接口,但不建议这样做,因为它涉及到安全代码。

方法2:继承AuthorizeAttribute类并重写其AuthorizeCore方法。签名为bool author izecore(httpcontext base httpcontext),代码如下:

公共类MyAuthorizeAttribute : AuthorizeAttribute { private string[]allowedUsers;public MyAuthorizeAttribute(params string[]users){ allowedUsers=new string[]{ ' admin ',' user1 ',' xf ' };}受保护的重写bool AuthorizeCore(httpContextbase Httpcontext){返回Httpcontext。请求。是经过身份验证的允许用户。包含(httpContext。用户。标识。名称,字符串比较器。不变量cultureignorecase);} }2.4.使用动作过滤器

动作过滤器是一种多功能过滤器,可用于任何目的。要创建自定义操作过滤器,需要实现IActionFilter接口,接口代码如下:

这个接口定义了两种方法。在MVC框架调用动作方法之前,它将调用OnActionExecting方法。调用操作方法后,调用OnActionExecuted方法。

实现操作执行方法

参数ActionExecutingContext对象继承自ControllerContext,它有两个属性:

动作描述符:提供关于动作方法的信息

结果:类型为ActionResult,可以通过为此属性设置非空值来取消此请求。

我们可以通过设置Result属性来取消带有过滤器的请求。代码如下:

公共类MyActionFilterAttribute : filter Attribute,iactionFilter { public void OnActionexecuting(actionexecuting context filter context){ if(filter context。http context . request . islocal){ filter context。result=new HttpnotFoundResult();}} public void onactionexecuted(actioexecutedcontext filter context){//未实现} }在本例中,on actionexecuted方法用于检查请求是否来自本地机器,如果是,则信息用户返回找不到“404”的响应。运行结果如下:

实现操作执行的方法

我们还可以通过OnActionExecuted方法执行一些跨越动作方法的任务。下面的例子是计算动作方法的运行时间。代码如下:

公共类MyActionFilterAttribute : filter attribute,IActionFilter {私有秒表计时器;public void on actionexecuting(actionexecuting context filter context){ timer=秒表。StartNew();} public void onationexecuted(ActionExecutedContext filter context){ timer。stop();If (filtercontext。异常==null) {filtercontext。httpcontext。回应。write(字符串。格式(' action方法延迟时间: {0} ',计时器。过去了。总秒数));}}}}我们将用户定义的动作过滤器MyActionFilter应用于HomeController的Index方法,运行结果如下:

2.5,使用结果过滤器

结果过滤器是一个多用途过滤器,可以操作动作方法生成的结果。结果过滤器实现了IResultFilter接口。创建自定义结果过滤器需要IResultFilter接口。界面代码如下:

将结果筛选器应用于操作方法时,在操作方法返回操作结果之前调用OnResultExecuting方法,在操作结果返回之后调用OnResultExecuted方法。以下示例用于计算操作方法返回的结果的运行时间。代码如下:

公共类MyResultFilterAttribute : filter attribute,IResultFilter {私有秒表计时器;public void on resultexecuting(ResultExecutingContext filter context){ timer=秒表。StartNew();} public void OnResultExecuted(ResultExecutedContext filter context){ timer。stop();filter context . httpcontext . response . write(string . format('结果执行延迟时间: {0} ',timer . theater . total seconds));}}我们将自定义结果过滤器MyResultFilter应用于HomeController的Index方法,运行结果如下:

需要注意的是,动作过滤器在页面输出之前运行,结果过滤器在页面输出之后运行。

2.6、使用异常过滤器

异常筛选器仅在调用操作方法并引发来自以下位置的未处理异常时运行:

另一个筛选器(授权、操作或结果筛选器)。

b、动作方法本身。

c、执行动作结果时。

使用内置的异常过滤器

HandleErrorAttribute(处理程序错误属性)是嵌入在MVC中的异常过滤器,它有以下三个重要属性:

1.异常类型:类型是类型,指示要由该筛选器处理的异常类型,包括其子类型。默认值为系统。例外

2.2。View:类型为字符串,表示由该过滤器呈现的视图页面,默认值为Error

3.母版页:呈现的视图页的母版页。如果未指定,视图将使用其默认母版页

只有当配置文件Web.config中配置的CustomError的模式设置为on(默认模式为RemoteOnly)时,嵌入的HandleErrorException才会生效,如下图所示:

过滤器还会将HandleErrorInfo类型的对象传递给视图,这样视图就可以显示一些关于错误的额外信息。以下是使用异常过滤器的示例。

应用于索引操作方法:

在“视图/共享”文件夹下添加显示异常信息的视图页面SpecialError.cshtml,页面代码如下:

@model HandleErrorInfo!DOCTYPE html html head meta name=' viewport ' content=' width=device-width '/title specialerror/title/head body div p存在[emailprotected]()。[email protected]的@ model时的名称。操作名称操作/p/div/body/html运行如下:

创建自定义异常过滤器

如果我们对异常过滤器有特殊要求,我们可以通过自定义异常过滤器来实现。要创建自定义异常过滤器,我们必须实现IExceptionFilter接口。界面代码如下:

当发生未知的处理异常时,调用OnException方法。该方法传递一个ExceptionContext对象,该对象从ControllerContext类派生,并定义了一些附加的特定于筛选器的属性,如下表所示:

引发的异常可通过异常属性访问。通过将ExceptionHandled属性设置为true,异常筛选器可以报告它已经处理了异常,并且将调用应用于某个操作的所有异常筛选器。

需要注意的是,如果一个动作方法的所有异常过滤器都将ExceptionHandled属性设置为true,那么MVC框架将使用默认的ASP.NET异常处理程序。

异常过滤器使用Result属性来告诉MVC框架该做什么。异常过滤器的两个主要应用是将异常记录到日志中,并向用户显示适当的消息。下面的代码演示了通过创建自定义异常筛选器,当特定时钟类的未处理异常发生时,用户被重定向到指定的错误页。

公共类myexectionattribute :筛选器属性,IExceptionfilter { public void one exception(异常上下文筛选器上下文){ if(!filterContext .异常处理过滤器上下文。异常为NullReferenceException){ FilterContext .结果=新的重定向结果(' ~/Content/specialerrorpage)。html ');filterContext .ExceptionHandled=true} }}然后在项目根目录添加一个名为内容的文件夹,在该文件夹下创建SpeciErrorPage.html文件,当异常被处理时,将以这个错误页面显示个用户。该页面代码如下:

!DOCTYPE html html xmlns=' http://www .w3。org/1999/XHTML ' hearteta http-equiv=' Content-Type ' Content=' text/html;charset=utf-8 '/title/title/head body h1对不起/h1 p这是一个例外测试/p在呈现主页的索引操作/body/html时出现了一个aNullReferenceException在控制器中应用我的行动异常过滤器,并主动让其抛出一个空引用异常,以便测试。

公共类HomeController :控制器{[myexeaction]公共操作结果索引(){ 0抛出新的NullReferenceException();} }运行结果如下:

总结:本文章简单总结了对过滤器的理解以及如何使用手动音量调节框架内置基本的过滤器和如何自定义过滤器及应用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:Asp中MVC学习总结过滤的详细说明 网是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。