1. 程式人生 > >Web API之過濾器建立過程原理解析【一】(十)

Web API之過濾器建立過程原理解析【一】(十)

前言

Web API的簡單流程就是從請求到執行到Action並最終作出響應,但是在這個過程有一把【篩子】,那就是過濾器Filter,在從請求到Action這整個流程中使用Filter來進行相應的處理從而作出響應,這對於授權以及驗證時及其重要的,所以說過濾器應用是Web API框架中非常重要的一種實現方式,我們有必要去探討其原理。

過濾器及其提供機制

Web API框架提供了一個請求、響應的訊息處理管道,並且其框架極具擴充套件性,通過其擴充套件可以對執行的流程進行適當的干預,其擴充套件點就體現在以下三個方面:

  • 將自定義的HttpMessageHandler註冊到訊息處理管道中。

  • 將自定義的標準化元件註冊到當前的服務容器(ServicesContainer)或者(HttpConfiguration)上。

  • 將自定義的過濾器Filter註冊到控制器或者Action方法上。

Filter建立原理解析

上一節我們講到了HttpActionDescriptor,顧名思義是在控制器方法上返回的是對控制器方法的描述型別,它封裝了控制器方法的一切資訊,而過濾器Filter就是在這個類中初始化和建立的,我們首先來看看這個類中我們會用到的方法及其屬性:

複製程式碼
 1 public abstract class HttpActionDescriptor
 2 {
3 // Fields 4 private HttpActionBinding _actionBinding; 5 private HttpConfiguration _configuration; 6 private HttpControllerDescriptor _controllerDescriptor; 7 private IActionResultConverter _converter; 8 private readonly Lazy<Collection<FilterInfo>> _filterPipeline;
9 private readonly ConcurrentDictionary<object, object> _properties; 10 private static readonly ResponseMessageResultConverter _responseMessageResultConverter; 11 private readonly Collection<HttpMethod> _supportedHttpMethods; 12 private static readonly VoidResultConverter _voidResultConverter; 13 14 // Methods 15 static HttpActionDescriptor(); 16 protected HttpActionDescriptor(); 17 protected HttpActionDescriptor(HttpControllerDescriptor controllerDescriptor); 18 private static bool AllowMultiple(object filterInstance); 19 public abstract Task<object> ExecuteAsync(HttpControllerContext controllerContext, IDictionary<string, object> arguments, CancellationToken cancellationToken); 20 public virtual Collection<T> GetCustomAttributes<T>() where T: class; 21 public virtual Collection<FilterInfo> GetFilterPipeline(); 22 public virtual Collection<IFilter> GetFilters(); 23 public abstract Collection<HttpParameterDescriptor> GetParameters(); 24 internal static IActionResultConverter GetResultConverter(Type type); 25 private Collection<FilterInfo> InitializeFilterPipeline(); 26 private static IEnumerable<FilterInfo> RemoveDuplicates(IEnumerable<FilterInfo> filters); 27 }
複製程式碼

我們首先看看這個此類的建構函式  protected HttpActionDescriptor(); 

複製程式碼
protected HttpActionDescriptor()
{
    this._properties = new ConcurrentDictionary<object, object>();
    this._supportedHttpMethods = new Collection<HttpMethod>();
    this._filterPipeline = new Lazy<Collection<FilterInfo>>(new Func<Collection<FilterInfo>>(this.InitializeFilterPipeline));
} 
複製程式碼

從上知過濾器管道的建立就是在此類的建構函式中進行。首先我們將建構函式進行擱置,我們先來了解過濾器的一些基本的資訊。

過濾器介面(IFilter)

1 2 3 4 5 public interface IFilter { // Properties bool AllowMultiple { get; } }

此介面只有一個只讀屬性AllowMultiple,它表示多個同類的過濾器型別是否允許指定應用到同一個目標物件上,如果允許指定,則該值為true,否則為false,預設是false。  

過濾器特性(FilterAttribute)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited=true, AllowMultiple=true)] public abstract class FilterAttribute : Attribute, IFilter { // Fields private static readonly ConcurrentDictionary<Type, bool> _attributeUsageCache; // Methods static FilterAttribute(); protected FilterAttribute(); private static 

相關推薦

Web API過濾器建立過程原理解析

前言 Web API的簡單流程就是從請求到執行到Action並最終作出響應,但是在這個過程有一把【篩子】,那就是過濾器Filter,在從請求到Action這整個流程中使用Filter來進行相應的處理從而作出響應,這對於授權以及驗證時及其重要的,所以說過濾器應用是

[轉]Web APi認證Authentication兩種實現方式十三

用戶數 ted das 客戶 元素 基礎 目標 開始 net 本文轉自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如

Web APi認證Authentication兩種實現方式十三

基於web 推薦 zed {0} scheme sage https 函數 ges 原文:Web APi之認證(Authentication)兩種實現方式【二】(十三)前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如何合理的利用

Java——Web開發MVC設計模式的學生資訊管理系統

為什麼這個標題為“(二)”,其實是對於上一個特別簡單學生資訊管理系統裡功能的完善。 所謂的“(一)”在這:學生資訊管理系統(一) 系統實現的功能: 實現新增學生 顯示查詢到的學生 刪除學生 更新學生資訊 模糊查詢符合相關資訊的學生

Unity序列化XML,JSON--------合成與解析轉載

尊重原創,轉載請註明出處,謝謝! 最近在學熱更新,涉及到資源熱更,所以就瞭解了XML,JSON相關的東西。這方面網上資料還是比較多的,所以這裡主要是總結一下基本使用方法和一些應用的Demo。 1.先介紹一下 XML 和 JSON 是什麼東西吧? (1

Shader特效——實現“抗鋸齒的黑白格”並原理解析GLSL

最終效果圖: 完整 程式碼與分析 如下: #extension GL_OES_standard_derivatives:enable //precision highp float; uniform int u_frequency; // ❤ 小格子的個數

Django1Django模組建立專案

  1.建立虛擬環境 python -m venv ll_env 建立一個名為ll_env的虛擬環境     如果Python是較早的版本,或者系統沒有正確的設定,將不能正確的使用模組venv,可以安裝virtualenv包   可執行pip install --user v

Django4建立其他頁面

建立完了網站的主頁後,我們將建立兩個顯示資料的網頁,一個列出所有的主題,另一個顯示特定主題的所有條目。對於每個網頁,都要指定其URL模式,編寫一個檢視函式,一個模板。這樣做之前,可以先編寫一個父模板,讓專案中的其他模板都繼承它。 1.模板繼承   1-1.父模板   先建立一個base.htm

Android 學習《第一行程式碼》第二版 筆記探究碎片

一個簡易版的新聞應用 同時相容手機和平板的應用程式 一、佈局 news_content_frag.xml額我的程式碼裡面是news_content_fragment.xml,圖片打錯了 二、程式碼編寫 1. 實體類(News.java) //新聞實體類 pub

Python基礎函式06

1什麼是函式? 函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。函式能提高應用的模組性,和程式碼的重複利用率。 2定義函式 要想定義一個由自己想要功能的函式,要遵守以下基本的規則: 函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號 ()。

Git“遠端倉庫”版本回退解決方案

由於TGB的圖書管理系統託管在本地伺服器上的GitLab中,最近因為大家使用Git過程出了一些問題,導致需要回退伺服器上的遠端版本,回退過程中又出了一些問題,比如push不上去,比如別人電腦的版本比遠端版本高几個commit版本等,在網上找了好多資料,這位博主的文章簡直涵蓋了我的問題,又有對

django專題路由django 路由表及反向解析

django 路由表及反向解析 – 個人草稿 django 路由表及反向解析 -- 個人草稿 錯誤訊息:The current path, ``, didn't match any of these 常見原因

深度學習筆記——理論與推導Structured LearningNLP

Language Technology Meaning of Word(一個vector表示一個word) Predicting the next word 給一串sequence of words,預測下一個單詞 我們現在要做的就是將wi

深度學習筆記——理論與推導Structured LearningMarkov Random Field

Graphical Model & Gibbs Sampling(Sturctured Learning) Graphical Model是Structured Learning中的一種。 Structured Learning複習

Unity Shader ------ UV動畫原理及簡易實現

前言 純粹的靜態美景宛如一張漂亮的貼圖,而在遊戲中,這種沒有一點動畫的情況往往是十分無趣且讓人感到彆扭的。所以本文會介紹一些簡單的UV動畫。 一. 時間變數 在我們寫遊戲邏輯時,涉及到隨時間移動或旋轉這種動作時,我們一般都會使用 Time.time 這個變數,同樣,在 Unity Shader 中,

SSD-Tensorflow超詳細解析:載入模型對圖片進行測試

SSD-tensorflow——github下載地址:SSD-Tensorflow目標檢測的塊速實現下載完成之後我們開啟工程,可以看到如下圖所示的檔案佈局:首先我們開啟checkpoints檔案,解壓縮ssd_300_vgg.ckpt.zip檔案到checkpoints目錄下

編譯原理龍書筆記詞法分析附聯絡答案仍未完成

這篇部落格是根據自己學習龍書的過程編寫,因為博主習慣了英語環境,在強行從英語轉化為中文的時候難免會有些不自然,請大家諒解。 感謝沉魚姐姐,很多答案都是參考了她的github,雖然無緣認識,但也算是一位領路人。 3.1 詞法分析器的作用 詞法分析

編譯原理龍書筆記一個簡單的語法制導翻譯器仍未完成

這篇部落格是根據自己學習龍書,因為博主習慣了英語環境,在強行從英語轉化為中文的時候難免會有些不自然,請大家諒解。 感謝沉魚姐姐,很多答案都是參考了她的github,雖然無緣認識,但也算是一位領路人。 正文: 一個簡單的語法制導翻譯器 在本章中

Objective-C語法第一個iPhone應用程式的那些事兒

#import "HelloWorldViewController.h" @implementation HelloWorldViewController - (void)didReceiveMemoryWarning { // Releases the view if it doesn't ha

原創Linux paging_init解析

背景 Read the fucking source code! --By 魯迅 A picture is worth a thousand words. --By 高爾基 說明: Kernel版本:4.14 ARM64處理器,Contex-A53,雙核 使用工具:Source Insight 3.5,