ASP.NET Web API 2 過濾器

?? 前言

我們知道 ASP.NET Web API 過濾器,也是屬于消息處理機制中的一部分。正因如此,我們經常使用它來完成對請求的授權驗證、參數驗證,以及請求的 Log 記錄,程序異常捕獲等。

?

1.?? 常用的四大過濾器

?? ASP.NET Web API 2 中的所有過濾器位于 System.Web.Http.dll 中的 System.Web.Http.Filters 命名空間中,繼承關系如下:

clip_image001[1]

1.?? AuthenticationFilter:身份證驗證過濾器,必須實現 IAuthenticationFilter 接口。微軟推出了一套身份驗證組件(ASP.NET Identity)就是采用了該過濾實現,該組件位于 System.Web.Http.Owin.dll 程序集,主要使用 System.Web.Http.HostAuthenticationFilter 過濾器,可參考:https://www.cnblogs.com/yidianfeng/p/7765984.html

2.?? AuthorizationFilter:授權過濾器,必須繼承于 AuthorizationFilterAttribute 類,或實現 IAuthorizationFilter 接口。

3.?? ActionFilter:動作過濾器,必須繼承于 ActionFilterAttribute 類,或者實現 IActionFilter 接口。

4.?? ExceptionFilter:異常過濾器,必須繼承于 ExceptionFilterAttribute 類,或者實現 IExceptionFilter 接口。

?

?? 注意:因為 Web API MVC 中很多過濾器名稱都相同,但過濾器位于的程序集和命名空間是不同的。MVC 中的過濾器位于 System.Web.Mvc.dll 中的 System.Web.Mvc 命名空間,這不能搞混了!

?

?? 首先,我們來看下過濾器的執行順序

clip_image003[1]

1)?? 圖中描述了4種過濾器的執行順序,而每個執行過程中發生異常,都會被異常過濾器捕獲。

2)?? 每當一個請求進來時,可能存在的三種響應結果:401,無訪問權限,500,請求發生異常,200,請求成功。

?

?? 過濾器的用法

1)?? 創建過濾器

1.?? AuthenticationFilter(身份驗證過濾器)

它是最先執行的過濾器,一般用于對訪問者的身份認證等。

/// <summary>

/// 身份驗證過濾器特性。

/// </summary>

public class CustomAuthenticationFilterAttribute

??? : System.Web.Http.Filters.FilterAttribute, System.Web.Http.Filters.IAuthenticationFilter

{

??? public System.Threading.Tasks.Task AuthenticateAsync(System.Web.Http.Filters.HttpAuthenticationContext context, System.Threading.CancellationToken cancellationToken)

??? {

??????? //這里完成身份驗證...

??????? return Task.FromResult(0);

??? }

?

??? public System.Threading.Tasks.Task ChallengeAsync(System.Web.Http.Filters.HttpAuthenticationChallengeContext context, System.Threading.CancellationToken cancellationToken)

??? {

??????? return Task.FromResult(0);

??? }

}

?

2.?? AuthorizationFilter(授權過濾器)

授權過濾器通常用于控制接口訪問權限,只有當訪問權限滿足時,才允許訪問程序中的接口。用于提高程序的安全性,防止程序被惡意篡改。通常可以使用 Basic 認證、簽名認證等。

/// <summary>

/// 授權過濾器特性。

/// </summary>

public class CustomAuthorizationFilterAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute

{

??? /// <summary>

??? /// 在過程請求授權時調用。

??? /// </summary>

??? /// <param name="actionContext">操作上下文,它封裝有關使用 System.Web.Http.Filters.AuthorizationFilterAttribute 的信息。</param>

??? public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)

??? {

??????? //這里完成請求權限的控制...

??? }

}

?

3.?? ActionFilter(動作過濾器)

動作過濾器中有兩個方法,一個是 OnActionExecuting(),在調用 Action() 方法之前執行,另一個是 OnActionExecuted(),在調用 Action() 方法之后執行。

/// <summary>

/// 動作過濾器特性。

/// </summary>

public class CustomActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute

{

??? /// <summary>

??? /// 在調用操作方法之前發生。

??? /// </summary>

??? /// <param name="actionContext">操作上下文。</param>

??? public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)

??? {

??????? //這里完成請求參數的驗證...

??? }

?

??? /// <summary>

??? /// 在調用操作方法之后發生。

??? /// </summary>

??? /// <param name="actionExecutedContext">操作執行的上下文。</param>

??? public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)

??? {

??????? //這里完成請求日志的記錄...

??? }

}

1.?? OnActionExecuting () 方法

通常可以在該方法中,完成對接口參數的效驗。

2.?? OnActionExecuted () 方法

一般可以用于記錄調用接口的 log

?

4.?? ExceptionFilter(異常過濾器)

異常過濾器中一個 OnException() 方法,當程序發生異常時將被執行。通常可以用于監控程序異常,記錄異常日志。

/// <summary>

/// 自定義異常過濾器特性。

/// </summary>

public class CustomExceptionFilterAttribute : System.Web.Http.Filters.ExceptionFilterAttribute

{

??? /// <summary>

??? /// 異常過濾器特性。

??? /// </summary>

??? /// <param name="actionExecutedContext">操作的上下文。</param>

??? public override void OnException(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)

??? {

??????? //當程序發生異常時執行的代碼...

??????? actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(

??????????? System.Net.HttpStatusCode.InternalServerError,

??????????? string.Format("異常:【{0}】已被捕獲", actionExecutedContext.Exception.Message));

??? }

}

?

2)?? 注冊過濾器

1.?? 注冊全局過濾器

WebApiConfig 類的 Register() 方法中注冊,例如:

config.Filters.Add(new WebAPI2.Filter.Filters.CustomExceptionFilterAttribute());

config.Filters.Add(new WebAPI2.Filter.Filters.CustomActionFilterAttribute());???????????

config.Filters.Add(new WebAPI2.Filter.Filters.CustomAuthorizationFilterAttribute());

config.Filters.Add(new WebAPI2.Filter.Filters.CustomAuthenticationFilterAttribute());??

通常異常過濾、動作過濾器都是定義為全局過濾器。

?

2.?? 定義 Controller Action 過濾器

我們需要為指定的 Controller Action 單獨設置過濾器時,也可以這樣定義:

[WebAPI2.Filter.Filters.CustomActionFilter]

[WebAPI2.Filter.Filters.CustomAuthorizationFilter]

[RoutePrefix("api/values")]

public class ValuesController : ApiController

{ }

或者

[WebAPI2.Filter.Filters.CustomAuthorizationFilter]

public HttpResponseMessage Get(HttpRequestMessage request, int id)

{

return request.CreateResponse<string>(HttpStatusCode.OK, "Get Action 方法執行,id值為:" + id);

}

?

?? 注意:過濾器不能在 FilterConfig 中的 RegisterGlobalFilters() 注冊,因為這里是注冊 MVC 過濾器的。

轉載于:https://www.cnblogs.com/abeam/p/8688838.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252033.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java的ThreadLocal類的使用方法

java的ThreadLocal類的使用方法&#xff0c;ThreadLocal是一個支持泛型的類&#xff0c;用在多線程中用于防止并發沖突問題。比如以下的一個樣例&#xff0c;就是用于線程添加1&#xff0c;可是相互不沖突 package com.test.threadlocal;import java.util.concurrent.ExecutorS…

為選擇合適的ERP供應商,是否該發布需求建議書(RFP)?

全球有成百上千家企業資源規劃 (ERP) 解決方案供應商。在開展挑選 ERP 供應商的項目時&#xff0c;不可能與所有這些供應商都進行接觸。不斷縮小這一領域供應商的范圍&#xff0c;直到最終敲定最適合的入圍名單&#xff08;通常被稱為“最終候選人名單”&#xff09;是項目成功…

kettle插入更新流程

kettle轉換步驟工作組件 這里有四個類構成了這個kettle 步驟/節點&#xff0c;每一個類都有其特定的目的及所扮演的角色。 TemplateStep: 步驟類實現了StepInteface接口&#xff0c;在轉換運行時&#xff0c;它的實例將是數據實際處理的位置。每一個執行線程都表示一個此類的實…

打開mobilenet——ssd的demo.py顯示這樣的錯誤解決方法:Intel MKL FATAL ERROR: Cannot load libmkl_avx.so or libmkl_def.s

終于找到方法了&#xff1a; ubuntu14.04打開終端&#xff1a; conda install nomkl numpy scipy scikit-learn numexpr conda remove mkl mkl-service一切ok。。。。。

C++ class、struct區別

一、默認訪問控制不同&#xff08;最主要&#xff09; struct默認為public&#xff0c;class默認為private。這個訪問控制既是指成員的默認訪問屬性&#xff0c;又指繼承時默認的繼承屬性。 二、定義template時不同 在模版中&#xff0c;類型參數前面可以使用class或typename&a…

Alpine Linux詳解

簡介 Small. Simple. Secure.Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox. Alpine Linux 是一個社區開發的面向安全應用的輕量級Linux發行版。 Alpine 的意思是“高山的”&#xff0c;它采用了musl libc和busybox以減…

java stream 原理

java stream 原理 需求 從"Apple" "Bug" "ABC" "Dog"中選出以A開頭的名字&#xff0c;然后從中選出最長的一個&#xff0c;并輸出其長度 1. 最直白的實現 缺點 迭代次數過多頻繁產生中間結果&#xff0c;性能無法接受2. 平常寫法 int …

ubuntu文本模式獲得權限修改profile

針對ubuntu14.04以下&#xff0c;越舊版本&#xff0c;舊的指令也有效。 進入登錄頁面&#xff0c;按shiftaltF1進入root環境&#xff0c;驗證用戶名密碼。 然后輸入&#xff1a;cd /etc 進入etc文件 在輸入&#xff1a;/usr/bin/sudo vi profile 進入profile文件的文本編輯模…

here文檔 here doc EOF重定向

here文檔 here doc EOF重定向 http://www.cnblogs.com/xiangzi888/archive/2012/03/24/2415077.html 在shell腳本程序中&#xff0c;向一條命令傳遞輸入的一種特殊方法是使用here文檔。一個here document就是一段帶有特殊目的的代碼段。它使用I/O重定向的形式將一個命令序列傳…

Java常量池理解與總結

2019獨角獸企業重金招聘Python工程師標準>>> 一.相關概念 什么是常量用final修飾的成員變量表示常量&#xff0c;值一旦給定就無法改變&#xff01;final修飾的變量有三種&#xff1a;靜態變量、實例變量和局部變量&#xff0c;分別表示三種類型的常量。Class文件中…

轉載:https://blog.csdn.net/dcrmg/article/details/52939318

張正友相機標定Opencv實現以及標定流程&&標定結果評價&&圖像矯正流程解析&#xff08;附標定程序和棋盤圖&#xff09;使用Opencv實現張正友法相機標定之前&#xff0c;有幾個問題事先要確認一下&#xff0c;那就是相機為什么需要標定&#xff0c;標定需要的輸…

Redis學習筆記--Redis數據過期策略詳解==轉

本文對Redis的過期機制簡單的講解一下  講解之前我們先拋出一個問題&#xff0c;我們知道很多時候服務器經常會用到redis作為緩存&#xff0c;有很多數據都是臨時緩存一下&#xff0c;可能用過之后很久都不會再用到了&#xff08;比如暫存session&#xff0c;又或者只存放日行…

會員連鎖配置以及金額走向

PS&#xff1a;所有電子支付方式的資金走向都是同樣的&#xff0c;配置的是什么支付方式就走什么支付方式;下面以支付寶為例說明 一、連鎖非總機模式 資金走向&#xff1a; 支付寶&#xff1a;收到的錢在主賬號配置的支付寶&#xff0c;會員卡的金額在主賬號 微信&#xff1a;收…

Python標準模塊--logging

Python標準模塊--logging參考http://www.cnblogs.com/zhbzz2007/p/5943685.html1 logging模塊簡介logging模塊是Python內置的標準模塊&#xff0c;主要用于輸出運行日志&#xff0c;可以設置輸出日志的等級、日志保存路徑、日志文件回滾等&#xff1b;相比print&#xff0c;具備…

Podfile grammar

參考&#xff1a;http://www.jianshu.com/p/8af475c4f717 Podfile Podfile文件詳細描述了一個或多個工程中targets的依賴關系。Podfile會默認創建一個隱式的目標鏈接到工程中用戶的第一個target&#xff0c;名稱為“default”。 一個Podfile可以非常簡單: *pod AFNetworking, ~…

并發編程 - 協程 - 1.協程概念/2.greenlet模塊/3.gevent模塊/4.gevent實現并發的套接字通信...

1.協程并發&#xff1a;切保存狀態單線程下實現并發&#xff1a;協程 切 保存狀態 yield 遇到io切&#xff0c;提高效率 遇到計算切&#xff0c;并沒有提高效率 檢測單線程下 IO行為 io阻塞 切 相當于騙操作系統 一直處于計算協程&#xff1a;。。。單線程下實現…

pymysql

連接數據庫 連接時需要額外指定參數dbcursor.execute( ) 操作SQL語句SELECT VERSION() 獲得當前版本CREATE DATABASE spiders DEFAULT CHARACTER SET utf8 創建數據庫import pymysql db pymysql.connect(hostlocalhost,user ,password ,port3306)#IP&#xff0c;用戶名&#x…

C# 多線程及同步簡介示例

60年代&#xff0c;在OS中能擁有資源和獨立運行的基本單位是進程&#xff0c;然而隨著計算機技術的發展&#xff0c;進程出現了很多弊端&#xff0c;一是由于進程是資源擁有者&#xff0c;創建、撤消與切換存在較大的時空開銷&#xff0c;因此需要引入輕型進程&#xff1b;二是…

opencv-python單目視覺標定,簡單易用。

import cv2 import numpy as np import glob# 設置尋找亞像素角點的參數&#xff0c;采用的停止準則是最大循環次數30和最大誤差容限0.001 criteria (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)# 獲取標定板角點的位置 objp np.zeros((6 * 7, 3), np.f…

python多線程多進程

一、線程&進程 對于操作系統來說&#xff0c;一個任務就是一個進程&#xff08;Process&#xff09;&#xff0c;比如打開一個瀏覽器就是啟動一個瀏覽器進程&#xff0c;打開一個記事本就啟動了一個記事本進程&#xff0c;打開兩個記事本就啟動了兩個記事本進程&#xff0c…