欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET Core MVC 過濾器的使用方法介紹

 更新時(shí)間:2017年09月22日 10:52:24   作者:Sweet-Tang  
本篇文章主要介紹了ASP.NET Core MVC 過濾器的使用方法介紹,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

過濾器的作用是在 Action 方法執(zhí)行前或執(zhí)行后做一些加工處理。使用過濾器可以避免Action方法的重復(fù)代碼,例如,您可以使用異常過濾器合并異常處理的代碼。

過濾器如何工作?

過濾器在 MVC Action 調(diào)用管道中運(yùn)行,有時(shí)稱為過濾器管道。MVC選擇要執(zhí)行的Action方法后,才會(huì)執(zhí)行過濾器管道:

實(shí)現(xiàn)

過濾器同時(shí)支持同步和異步兩種不同的接口定義。您可以根據(jù)執(zhí)行的任務(wù)類型,選擇同步或異步實(shí)現(xiàn)。

同步過濾器定義OnStageExecuting和OnStageExecuted方法,會(huì)在管道特定階段之前和之后運(yùn)行代碼的。例如IActionFilter過濾器,在調(diào)用Action方法之前調(diào)用OnActionExecuting,在Action方法之回之后調(diào)用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
  }
 }

異步過濾器定義了一個(gè)OnStageExecutionAsync方法。該方法提供了FilterTypeExecutionDelegate的委托,當(dāng)調(diào)用該委托時(shí)會(huì)執(zhí)行具體管道階段的工作。例如,ActionExecutionDelegate用于調(diào)用Action方法,您可以在調(diào)用它之前和之后執(zhí)行代碼。

 public class SampleAsyncActionFilter : IAsyncActionFilter
 {
  public async Task OnActionExecutionAsync(
   ActionExecutingContext context,
   ActionExecutionDelegate next)
  {
   // do something before the action executes
   await next();
   // do something after the action executes
  }
 }

您可以在單個(gè)類中實(shí)現(xiàn)多個(gè)過濾器接口。例如,ActionFilterAttribute抽象類實(shí)現(xiàn)了IActionFilter和IResultFilter,以及與它們對(duì)應(yīng)的異步接口。

提示

您不需要同時(shí)實(shí)現(xiàn)兩種過濾器接口,要么是同步的,要么是異步的。框架首先檢查過濾器是否實(shí)現(xiàn)了異步接口,如果是,直接執(zhí)行異步方法。如果不是,它會(huì)執(zhí)行同步接口的方法。如果在一個(gè)類上同時(shí)實(shí)現(xiàn)兩種接口,則只會(huì)調(diào)用異步方法。當(dāng)使用像ActionFilterAttribute這類抽象類時(shí),您只需要覆蓋過濾器的同步方法或異步方法。

過濾器類型

ASP.NET Core 有以下五種類型的過濾器,每個(gè)過濾器類型在過濾器管道中的不同階段執(zhí)行:

1.Authorization Filter

授權(quán)過濾器 在過濾器管道中第一個(gè)執(zhí)行,通常用于驗(yàn)證當(dāng)前請(qǐng)求的合法性,不合法后面的管道會(huì)直接跳過。它們只有一個(gè)Before方法,不像其它大多數(shù)過濾器支持前置階段方法和后置階段方法。注意,您不要在授權(quán)過濾器中拋出異常,因?yàn)闆]有任何代碼來處理異常(異常過濾器不處理它們)。

2.Resource Filter

資源過濾器是第二個(gè)運(yùn)行,在 Authorization Filter 之后,Model Binding 之前執(zhí)行。在性能方面,資源過濾器在實(shí)現(xiàn)緩存或截?cái)噙^濾器管道尤為重要。

3.Action Filter

使用率最高的過濾器,在調(diào)用 Acioin 方法之前和之后執(zhí)行代碼。跟 Resource Filter 很類似,但 Model Binding 在之后執(zhí)行。

4.Exception Filter

用于為應(yīng)用程序執(zhí)行異常處理策略。

5.Result Filter

當(dāng) Action 執(zhí)行完成后,最后會(huì)執(zhí)行過濾器。用于處理ActionResult結(jié)果輸出策略。

過濾器運(yùn)行順序

ASP.NET Core 的每個(gè)請(qǐng)求都會(huì)先經(jīng)過已注冊(cè)的Middleware,接著才會(huì)執(zhí)行過濾器:同類型的過濾器都會(huì)以先進(jìn)后出的方式執(zhí)行。

黃色箭頭是正常情況流程
灰色箭頭是異常處理流程

過濾器的作用域與執(zhí)行順序

過濾器具有三種不同級(jí)別的作用域。您可以通過Attribute將過濾器注冊(cè)到指定控制器或 Action 方法;您也可以在Startup類的ConfigureServices方法中將過濾器注冊(cè)到MvcOptions.Filters的集合中作為全局過濾器(對(duì)所有的控制器和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 instance
    options.Filters.Add(typeof(SampleActionFilter)); // by type
    options.Filters.Add(new SampleGlobalActionFilter()); // an instance
   });

   services.AddScoped<AddHeaderFilterWithDi>();
  }
 }

示例來自于ASP.NET Core MVC 英語文檔

默認(rèn)執(zhí)行順序

當(dāng)管道的某個(gè)階段存在多個(gè)過濾器時(shí),過濾器執(zhí)行的默認(rèn)順序由作用域確定:全局過濾器優(yōu)先于控制器過濾器,控制器過濾器優(yōu)先于Action方法過濾器。

以下示例是同步 Action 過濾器調(diào)用的順序:

序號(hào) 過濾器作用域 過濾器方法
1 Global OnActionExecuting
2 Controller OnActionExecuting
3 Method OnActionExecuting
4 Method OnActionExecuted
5 Controller OnActionExecuted
6 Global OnActionExecuted

提示

每個(gè)控制器的基類Controller包含OnActionExecuting和OnActionExecuted方法。其中OnActionExecuting在所有過濾器之前調(diào)用,OnActionExecuted在所有過濾器之后調(diào)用。

覆蓋默認(rèn)執(zhí)行順序

您可以通過實(shí)現(xiàn)IOrderedFilter接口來覆蓋默認(rèn)的執(zhí)行順序。此接口公開了Order屬性表示優(yōu)先級(jí),以確定執(zhí)行順序;具有較低Order值的過濾器將在具有較高Order值的過濾器之前執(zhí)行前置方法;具有較低Order值的過濾器將在具有較高Order值的過濾器之后執(zhí)行后置方法。

您可以使用構(gòu)造函數(shù)參數(shù)設(shè)置Order屬性:

[MyFilter(Name = "Controller Level Attribute", Order=1)]

如果您將上述示例中 Action 過濾器的Order設(shè)置為1,將控制器和全局過濾器的Order屬性分別設(shè)置為2和3,則執(zhí)行順序?qū)⑴c默認(rèn)相反。

序號(hào) 過濾器作用域 Order 屬性 過濾器方法
1 Method 1 OnActionExecuting
2 Controller 2 OnActionExecuting
3 Global 3 OnActionExecuting
4 Global 3 OnActionExecuted
5 Controller 2 OnActionExecuted
6 Method 1 OnActionExecuted

過濾器執(zhí)行時(shí),Order屬性的優(yōu)先級(jí)高于作用域。過濾器首先按Order屬性排序,然后再按作用域排序。所有內(nèi)置過濾器實(shí)現(xiàn)IOrderedFilter接口并將Order值默認(rèn)設(shè)置為0;因此,除非設(shè)置Order屬性為非零值,否則按作用域的優(yōu)先級(jí)執(zhí)行。

總結(jié)

今天我們已經(jīng)了解了關(guān)于過濾器基本知識(shí),在下一篇博客中,我們將介紹內(nèi)置過濾器、過濾的使用、依賴注入、取消與截?cái)嗟戎R(shí),謝謝!

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • asp.net保存遠(yuǎn)程圖片的代碼

    asp.net保存遠(yuǎn)程圖片的代碼

    最近有點(diǎn)煩,沒怎么看書,幾天下來,就研究了一個(gè)保存遠(yuǎn)程圖片的。
    2008-09-09
  • .Net Core日志記錄之日志配置

    .Net Core日志記錄之日志配置

    這篇文章介紹了.Net Core日志記錄之日志配置,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • VS2010發(fā)布Web網(wǎng)站技術(shù)攻略

    VS2010發(fā)布Web網(wǎng)站技術(shù)攻略

    本篇文章主要包含了完整的發(fā)布網(wǎng)站步驟、發(fā)布網(wǎng)站過程中可能遇到的問題,以及配套的解決方法,相信感興趣的朋友一定會(huì)喜歡這篇文章的
    2015-07-07
  • .NET微信公眾號(hào)查看關(guān)注者接口

    .NET微信公眾號(hào)查看關(guān)注者接口

    這篇文章主要為大家詳細(xì)介紹了.NET微信公眾號(hào)查看關(guān)注者接口的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • .NET微服務(wù)架構(gòu)CI/CD自動(dòng)構(gòu)建Jenkins+Gitee

    .NET微服務(wù)架構(gòu)CI/CD自動(dòng)構(gòu)建Jenkins+Gitee

    這篇文章介紹了.NET使用微服務(wù)架構(gòu)CI/CD自動(dòng)構(gòu)建Jenkins+Gitee的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • .Net?Core?3.1?Web?API基礎(chǔ)知識(shí)詳解(收藏)

    .Net?Core?3.1?Web?API基礎(chǔ)知識(shí)詳解(收藏)

    這篇文章主要介紹了.Net?Core?3.1?Web?API基礎(chǔ)知識(shí),本文內(nèi)容篇幅有點(diǎn)長,大家耐心閱讀,此文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • asp.net中GridView控件遍歷的小例子

    asp.net中GridView控件遍歷的小例子

    在asp.net中要遍歷像數(shù)據(jù)之類的內(nèi)容我們一般會(huì)用到for,foreach,while這種了,下面我來介紹利用for遍歷GridView控件
    2013-08-08
  • 詳解ASP.NET驗(yàn)證碼的生成方法

    詳解ASP.NET驗(yàn)證碼的生成方法

    這篇文章主要為大家詳細(xì)介紹了ASP.NET驗(yàn)證碼的生成方法,以及ASP.NET生成驗(yàn)證碼的實(shí)現(xiàn)步驟和思路,感興趣的小伙伴們可以參考一下
    2016-05-05
  • .NET中l(wèi)ambda表達(dá)式合并問題及解決方法

    .NET中l(wèi)ambda表達(dá)式合并問題及解決方法

    這篇文章主要介紹了.net?lambda表達(dá)式合并問題,解決方法是自己構(gòu)造一個(gè)新的表達(dá)式,構(gòu)造表達(dá)式需要用到expression類,本文結(jié)合實(shí)例代碼給大家詳細(xì)介紹,需要的朋友可以參考下
    2022-10-10
  • Asp.net MVC中使用JQuery插件ajaxFileUpload上傳文件

    Asp.net MVC中使用JQuery插件ajaxFileUpload上傳文件

    這篇文章主要介紹了Asp.net MVC中使用JQuery插件ajaxFileUpload上傳文件,需要的朋友可以參考下
    2016-08-08

最新評(píng)論