国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:35:58
文檔

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解: 一、過濾器簡介 1.1、理解什么是過濾器 1、過濾器(Filters)就是向請求處理管道中注入額外的邏輯。提供了一個簡單而優(yōu)雅的方式來實現(xiàn)橫切關(guān)注點。 2、所謂的過濾器(Filters),MVC框架里面的過濾器完全不同于ASP.NET平臺里面的Request.Filte
推薦度:
導(dǎo)讀Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解: 一、過濾器簡介 1.1、理解什么是過濾器 1、過濾器(Filters)就是向請求處理管道中注入額外的邏輯。提供了一個簡單而優(yōu)雅的方式來實現(xiàn)橫切關(guān)注點。 2、所謂的過濾器(Filters),MVC框架里面的過濾器完全不同于ASP.NET平臺里面的Request.Filte

 一、過濾器簡介

1.1、理解什么是過濾器

1、過濾器(Filters)就是向請求處理管道中注入額外的邏輯。提供了一個簡單而優(yōu)雅的方式來實現(xiàn)橫切關(guān)注點。

2、所謂的過濾器(Filters),MVC框架里面的過濾器完全不同于ASP.NET平臺里面的Request.Filters和Response.Filter對象,它們主要是實現(xiàn)請求和響應(yīng)流的傳輸。通常我們所說的過濾器是指MVC框架里面的過濾器。

3、過濾器可以注入一些代碼邏輯到請求處理管道中,是基于C#的Attribute的實現(xiàn)。當(dāng)負責(zé)調(diào)用Action的類ControllerActionInvoker在調(diào)用執(zhí)行Action的時候會檢查Action上面的Attribute并查看這些Attribute是否實現(xiàn)了指定的接口,以便進行額外的代碼注入處理

 1.2、理解為什么要使用過濾器

假設(shè)你做了一個小項目,其中某個功能是操作管理用戶信息模塊,有這樣一個需求,對用戶信息管理必須是已通過認證的用戶才能操作,我們可以在每一個Action方法里面檢查認證請求,如下所示:

using MvcFilterDmo.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MvcFilterDmo.Controllers
{
 public class HomeController : Controller
 {
 public ActionResult Index()
 {
 if (!Request.IsAuthenticated)
 {
 FormsAuthentication.RedirectToLoginPage();
 }
 //操作部分...
 return View();
 }
 public ActionResult Insert()
 {
 if (!Request.IsAuthenticated)
 {
 FormsAuthentication.RedirectToLoginPage();
 }
 //操作部分...
 return View();
 }
 public ActionResult Update()
 {
 if (!Request.IsAuthenticated)
 {
 FormsAuthentication.RedirectToLoginPage();
 }
 //操作部分...
 return View();
 }
 public ActionResult Delete()
 {
 if (!Request.IsAuthenticated)
 {
 FormsAuthentication.RedirectToLoginPage();
 }
 //操作部分...
 return View();
 }
 //其他Action操作方法
 //...
 }
}

通過上面的代碼,可以發(fā)現(xiàn)使用這種方式檢查請求認證有許多重復(fù)的地方,這也就是為什么要使用過濾器的原因,使用過濾器可以實現(xiàn)相同的效果。如下所示:

using MvcFilterDmo.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MvcFilterDmo.Controllers
{
 [Authorize]
 public class HomeController : Controller
 {
 public ActionResult Index()
 {
 //操作部分...
 return View();
 }
 public ActionResult Insert()
 {
 //操作部分...
 return View();
 }
 public ActionResult Edit()
 { 
 //操作部分...
 return View();
 }
 public ActionResult Delete()
 {
 //操作部分...
 return View();
 }
 //其他Action操作方法
 //...
 }
}

過濾器是.NET里面的特性(Attributes),它提供了添加到請求處理管道的額外方法。這里使用Authorize過濾器可以實現(xiàn)同樣的效果,不過代碼就顯然比之前更加簡潔優(yōu)雅。

 二、過濾器的使用

2.1、基本類型的過濾器

過濾器實現(xiàn)的機制:在MVC框架調(diào)用一個Action之前,它會檢查方法的定義中是否實現(xiàn)了特性(Attributes),如果實現(xiàn)的話,那么在請求處理管道適當(dāng)?shù)奈恢茫撎匦远x的方法會被調(diào)用。

ActionFilterAttribute類既實現(xiàn)了IactionFilter接口,也實現(xiàn)IResultFilter接口。這是一個抽象類,它要求你必須提供一個實現(xiàn)。AuthorizeAttribute和HandleErrorAttribute類,則包含了一些有用的特性,并且可以不必創(chuàng)建派生類進行使用。

 2.2、過濾器的應(yīng)用、應(yīng)用方式以及執(zhí)行順序

應(yīng)用: 過濾器可以被應(yīng)用到控制器上也可以用到Action方法上,應(yīng)用到控制上時,表示所有的Action方法都有了這個過濾器,并且可以混合使用,或多次使用,如下所示:

[A] //表示所有的Action方法都會應(yīng)用A過濾器
Public class DemoController:Controller
{
 [B]//B,C過濾器只作用于此Action方法,但它也會有A過濾器的應(yīng)用效果
 [C]
 Public ActionResult Index()
 {
 //操作部分...
 return View();
 } 
}

應(yīng)用方式:特性的方式,如上面代碼所示。

執(zhí)行順序:相同類型過濾器,執(zhí)行順序靠近方法的先執(zhí)行,不同類型的過濾器一般執(zhí)行順序為【authorize--->action--->actionResult】至于異常過濾器不分先后,只要拋出異常時就會執(zhí)行異常過濾器。如果要調(diào)整執(zhí)行順序,可以通過調(diào)整Order方法值大小來控制執(zhí)行順序,值越小,越先執(zhí)行。下圖是Action/Result過濾器應(yīng)用的執(zhí)行順序圖

(1)、相同類型過濾器應(yīng)用示例:兩個自定義Action過濾器MyFirstFilter,MyThreeFilter應(yīng)用到同一個Action方法Index上。

Three控制器代碼如下:

MyFirstFilter 代碼如下:

MyThreeFilter代碼如下:

運行結(jié)果如下:

 

(2)、不同類型過濾器應(yīng)用示例:有一個自定義Action過濾器MyFirstFilter,有一個自定義Result過濾器MySecondFilter,應(yīng)用到同一個Action方法Index上。

Three控制器代碼如下:

MyFirstFilter 代碼如下:

MySecondFilter代碼如下:

運行結(jié)果如下:

看完上面的解釋,可能你現(xiàn)在對這些過濾器的執(zhí)行順序,以及如何自定義過濾器還不明白,不要緊,下面我們會逐一介紹這幾個基本的過濾器的使用,以及如何自定義過濾器。

 2.3、使用授權(quán)過濾器

所有實現(xiàn)了IAuthorizationFilter接口的都可以稱之為授權(quán)過濾器:其定義如下:

 public interface IAuthorizationFilter
 {
 void OnAuthorization(AuthorizationContext filterContext);
 }

由于MVC框架系統(tǒng)自帶的AuthorizeAttribute實現(xiàn)有一些突出的功能,而這種牽涉到安全的代碼一定要謹慎的編寫,所以一般我們不會直接實現(xiàn)這個接口,而是去繼承AuthorizeAttribute這個類,并重寫其AuthorizeCore方法,簽名為: bool AuthorizeCore(HttpContextBase httpContext) 而處理授權(quán)失敗的時候,可以重寫其HandleUnauthorizedRequest方法,其簽名為: void HandleUnauthorizedRequest(AuthorizationContext context) 。注意:驗證與授權(quán)是兩回事,驗證發(fā)生在授權(quán)之前。

默認的授權(quán)過濾器已經(jīng)有了驗證的功能,其驗證的機理是利用Asp.net平臺自帶的驗證機制,如表單驗證和Windows驗證。除了驗證功能,它本身還有授權(quán)的功能。授權(quán)過濾器是所有過濾器中最早運行的。

經(jīng)過Route到達了控制器的時候,在調(diào)用Action之前,MVC框架會檢測在相關(guān)的Action上是否有授權(quán)過濾器,如果有會調(diào)用OnAuthorization方法,如果此方法批準(zhǔn)了請求,才會調(diào)用相應(yīng)的Action。

使用授權(quán)過濾器幾種情況如下:

1.直接在Action上或者控制器上加Authorize,表示啟用了驗證,但不牽涉到授權(quán)。

2.添加Authorize(Users=“a,b”)],表示啟用了驗證,并且也啟用了授權(quán),只有a或者b用戶能訪問此控制器。

3.當(dāng)添加Authorize(Roles=“admin,Member”)]時的步驟如下:

---利用asp.net自帶的角色提供者,或者實現(xiàn)自己的角色提供者,實現(xiàn)自己的角色提供者時,只需要集成RoleProvider類型,并實現(xiàn)其中的所有方法或部分方法,最好實現(xiàn)所有方法。

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

---在適當(dāng)?shù)腁ction中利用Roles類型來訪問自己創(chuàng)建的RoleProvider中的相關(guān)方法。

使用內(nèi)置的授權(quán)過濾器

MVC框架內(nèi)置的授權(quán)過濾器AuthorizeAttribute,它允許我們使用這個類的兩個公共屬性來指定授權(quán)策略,如下所示:

 Users和Roles兩者是并且的關(guān)系,例如Users=“a,b,c”,Roles=“admin”,表示用戶是a,b,c 其中一個并且是Admin角色才能訪問。

創(chuàng)建自定義的授權(quán)過濾器

方式一:直接實現(xiàn)IAuthorizationFilter接口,但不推薦這樣做,因為牽涉到安全方面的代碼。

方式二:繼承AuthorizeAttribute這個類,并重寫其AuthorizeCore方法,簽名為: bool AuthorizeCore(HttpContextBase httpContext),代碼如下所示:

public class MyAuthorizeAttribute : AuthorizeAttribute
 {
 private string[] allowedUsers;
 public MyAuthorizeAttribute(params string[] users)
 {
 allowedUsers = new string[] { "admin", "user1", "xf" };
 }

 protected override bool AuthorizeCore(HttpContextBase httpContext)
 {
 return httpContext.Request.IsAuthenticated &&allowedUsers.Contains(httpContext.User.Identity.Name, 
 StringComparer.InvariantCultureIgnoreCase);
 }
 }

2.4、使用動作過濾器

 動作過濾器是可以以用于任何目的的多用途過濾器,創(chuàng)建自定義動作過濾器需要實現(xiàn)IActionFilter接口,該接口代碼如下所示:

該接口定義了兩個方法,MVC框架在調(diào)用動作方法之前,會調(diào)用OnActionExecting方法。在調(diào)用動作方法之后,則會調(diào)用OnActionExecuted方法。

實現(xiàn)OnActionExecting方法

參數(shù)ActionExecutingContext對象繼承于ControllerContext,其中的2個屬性:

ActionDescriptor:提供了關(guān)于Action方法的相關(guān)信息

Result:類型為ActionResult,通過給這個屬性設(shè)置一個非null的值就可以取消這個請求。

我們可以用過濾器來取消一個請求,通過設(shè)置Result屬性即可。代碼如下所示:

public class MyActionFilterAttribute : FilterAttribute, IActionFilter
 {
 public void OnActionExecuting(ActionExecutingContext filterContext)
 {
 if(filterContext.HttpContext.Request.IsLocal)
 {
 filterContext.Result = new HttpNotFoundResult();
 }
 }
 public void OnActionExecuted(ActionExecutedContext filterContext)
 {
 //未做實現(xiàn)
 }
 }

這個例子通過用OnActionExecuting方法檢查請求是否來自本地機器,如果是,編隊用戶返回一個“404”未找到的響應(yīng)。運行結(jié)果如下圖:

 

實現(xiàn)OnActionExecuted方法

我們也可以通過OnActionExecuted方法來執(zhí)行一些跨越動作方法的任務(wù),下面這個例子是計算動作方法運行的時間,代碼如下:

public class MyActionFilterAttribute : FilterAttribute, IActionFilter
 {
 private Stopwatch timer;
 public void OnActionExecuting(ActionExecutingContext filterContext)
 {
 timer = Stopwatch.StartNew();
 }
 public void OnActionExecuted(ActionExecutedContext filterContext)
 {
 timer.Stop();
 if (filterContext.Exception == null)
 {
 filterContext.HttpContext.Response.Write(
 string.Format("動作方法延遲的時間: {0}",
 timer.Elapsed.TotalSeconds));
 }
 }
 }
}

我們將自定義的動作過濾器MyActionFilter應(yīng)用到HomeController的Index方法上,運行結(jié)果如下:

 2.5、使用結(jié)果過濾器

結(jié)果過濾器是多用途的過濾器,他會對動作方法所產(chǎn)生結(jié)果進行操作,結(jié)果過濾器實現(xiàn)IResultFilter接口,創(chuàng)建自定義結(jié)果過濾器需要現(xiàn)IResultFilter接口,該接口代碼如下所示:

當(dāng)結(jié)果過濾器運用于一個動作方法時,會在動作方法返回動作結(jié)果之前,調(diào)用OnResultExecuting方法,在返回動作結(jié)果之后,會調(diào)用OnResultExecuted方法。下面這個例子是計算動作方法返回結(jié)果運行的時間,代碼如下:

public class MyResultFilterAttribute : FilterAttribute, IResultFilter
 {
 private Stopwatch timer;
 public void OnResultExecuting(ResultExecutingContext filterContext)
 {
 timer = Stopwatch.StartNew();
 }
 public void OnResultExecuted(ResultExecutedContext filterContext)
 {
 timer.Stop();
 filterContext.HttpContext.Response.Write(string.Format("結(jié)果執(zhí)行延遲時間: {0}", timer.Elapsed.TotalSeconds));
 }
}

我們將自定義的結(jié)果過濾器MyResultFilter應(yīng)用到HomeController的Index方法上,運行結(jié)果如下:

 

需要注意的是:動作過濾器是運行在頁面輸出之前,結(jié)果過濾器是運行在頁面輸出之后。

 2.6、使用異常過濾器

異常過濾器只有在調(diào)用一個動作方法而拋出未處理的異常才會運行,這種異常來自以下位置:

A、另一種過濾器(授權(quán)、動作、或結(jié)果過濾器)。

B、動作方法本身。

C、當(dāng)動作結(jié)果被執(zhí)行時。

使用內(nèi)置的異常過濾器

HandleErrorAttribute(處理程序錯誤特性),它是MVC內(nèi)嵌的異常過濾器,有以下3個重要的屬性:

1.ExceptionType:類型為Type,表示希望被此過濾器處理的異常類型,包括其子類型,默認值為System.Exception

2.View:類型為string,表示此過濾器呈遞的視圖頁面,默認值為Error

3.Master:呈遞的視圖頁的母板頁,如果不指定,視圖會用其默認的母版頁

內(nèi)嵌的HandleErrorException只有在配置文件Web.config中配置的CustomError 的mode設(shè)置為on的時候才生效(其默認模式為RemoteOnly),如下圖所示:

 

此過濾器還會給視圖傳遞一個HandleErrorInfo類型的對象給視圖,以便視圖可以顯示一些額外的關(guān)于錯誤的信息。下面是使用異常過濾器的示例。

應(yīng)用到Index動作方法上:

 

在Views/Shared文件夾下添加一個顯示異常信息的視圖頁SpecialError.cshtml,頁面代碼如下:

@model HandleErrorInfo
 <!DOCTYPE html>
 <html>
 <head>
 <meta name="viewport" content="width=device-width" />
 <title>SpecialError</title>
 </head>
 <body>
 <div>
 <p>
 There was a<b>@Model.Exception.GetType().Name</b>
 while rendering<b>@Model.ControllerName</b>'s
 <b>@Model.ActionName</b> action
 </p>
 </div>
 </body>
</html>

運行結(jié)果如下:

 

創(chuàng)建自定義的異常過濾器

如果我們對異常過濾器有特殊的需求,可以通過自定義的異常過濾器來完成,創(chuàng)建自定義異常過濾器必須實現(xiàn)IExceptionFilter接口,該接口代碼如下:

 

當(dāng)一個未知處理異常發(fā)生時,OnException方法會被調(diào)用。該方法的傳遞一個ExceptionContext對象,派生于ControllerContext類,定義了一些額外的過濾器專有屬性如下表所示:

拋出的異常通過Exception屬性是可以訪問的。通過把ExceptionHandled屬性設(shè)置為true,一個異常過濾器可以報告它已經(jīng)處理了該異常,應(yīng)用于一個動作的所有異常過濾器都會被調(diào)用。

需要注意的是:如果一個動作方法的所有異常過濾器均為把ExceptionHandled屬性設(shè)置為true,MVC框架將使用默認的ASP.NET異常處理程序。

Result屬性有異常過濾器使用,以告訴MVC框架要做什么,異常過濾器的兩個主要應(yīng)用是記錄該異常到日志,并把適當(dāng)?shù)南@示給用戶。下面的代碼將演示通過創(chuàng)建一個自定義的異常過濾器,當(dāng)一個特定的鐘類的未處理異常出現(xiàn)時,把該用戶重定向到一個指定的錯誤頁面。

public class MyExectionAttribute:FilterAttribute,IExceptionFilter
 {
 public void OnException(ExceptionContext filterContext)
 {
 if(!filterContext.ExceptionHandled&&
 filterContext.Exception is NullReferenceException)
 {
 filterContext.Result = new RedirectResult("~/Content/SpecialErrorPage.html");
 filterContext.ExceptionHandled = true;
 }
 }
}

然后在項目根目錄添加一個名為Content的文件夾,在該文件夾下創(chuàng)建SpeciErrorPage.html文件,當(dāng)異常被處理時,將以這個錯誤頁面顯示個用戶。該頁面代碼如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <title></title>
</head>
<body>
 <h1>Sorry</h1>
 <p>this is a Excetption test</p>
 There was aNullReferenceException while renderingHome's Index action 
</body>
</html>

在控制器中應(yīng)用MyExection異常過濾器,并主動讓其拋出一個空引用異常,以便測試。

public class HomeController : Controller
 {
 [MyExection]
 public ActionResult Index()
 {
 throw new NullReferenceException();
 }
 }

運行結(jié)果如下:

 

總結(jié):本文章簡單總結(jié)了對過濾器的理解以及如何使用MVC框架內(nèi)置基本的過濾器和如何自定義過濾器及應(yīng)用。

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解: 一、過濾器簡介 1.1、理解什么是過濾器 1、過濾器(Filters)就是向請求處理管道中注入額外的邏輯。提供了一個簡單而優(yōu)雅的方式來實現(xiàn)橫切關(guān)注點。 2、所謂的過濾器(Filters),MVC框架里面的過濾器完全不同于ASP.NET平臺里面的Request.Filte
推薦度:
標(biāo)簽: 學(xué)習(xí) 詳解 解析
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 日本特级淫片免费 | zozozo性欧美禽交3 | 亚洲免费久久 | 国产日产欧美精品一区二区三区 | 多人伦精品一区二区三区视频 | 久久久久国产成人精品亚洲午夜 | 国产成人久久蜜一区二区 | 国产国语一级a毛片高清视频 | 欧美精品免费在线 | 亚洲第一页在线播放 | 九一毛片 | 久久国产香蕉视频 | 亚洲视频一区二区三区 | 91精品国产91久久综合 | 国产精品成人一区二区1 | 亚洲欧洲高清有无 | 欧美日韩大尺码免费专区 | 欧美一区二区三区视频在线 | 日本韩国一区二区 | 日韩不卡手机视频在线观看 | 国产成人一区二区三区 | 日韩在线观看精品 | 国产中的精品一区的 | 国产日韩欧美 | 久久国产精品成人免费古装 | 精品国产96亚洲一区二区三区 | 国产麻豆流白浆在线观看 | 看一级特黄a大片日本片 | 国产精品免费精品自在线观看 | 一级毛片真人不卡免费播 | www.色人阁| 欧美成人禁片在线观看网址 | 伊人色综合97 | 精品久久久久久久久中文字幕 | 日本一区二区三区在线观看 | 中文字幕一区二区三区四区 | 久久精品a一国产成人免费网站 | 欧美精品免费在线 | 日韩欧美在线综合网 | 日韩视频免费在线观看 | 久久久久久综合成人精品 |