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
|