每當製做一個WebAPI,就必然會收到外部不少調用這個API的請求,有時候,咱們但願,能從這些外部來的請求中,按照必定條件篩選過濾一下,只將那些咱們以爲合法的,有必要回應的請求放進來,一方面擋住那些非法請求,一方面也能夠節省服務器應付無效請求的資源html
這個時候,咱們就須要建立一個過濾器web
碰巧,前幾年給以前某家公司作webapi的時候,鑽研過這部分,恰好讓我找到了一個在請求到達controller以前過濾掉的辦法json
好了,廢話很少說,直奔主題,這個過濾器的核心就是一個messageHandler,至於它是怎麼起到過濾的做用,這方面的原理,我就不詳述了,想知道的同窗能夠點進下面連接api
https://www.cnblogs.com/wk1234/archive/2012/05/07/2486872.html服務器
既然核心是一個messageHandler,那麼首先就是要建立一個Handler類,以下圖ide
我給這個Handler類起名叫CustomHandler(固然叫別的名字也能夠,這個隨我的喜愛),接下來,就是核心代碼部分ui
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net.Http; using System.Net; using System.Threading.Tasks; using System.Text; namespace Cabbeen.EWM.RFWebAPI.Handler { public class CustomHandler: DelegatingHandler { protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { string message = ""; var content = request.Content; string jsonContent = content.ReadAsStringAsync().Result;//用這個方法能夠獲取請求裏的body參數值 if (jsonContent.Length < 10) { //無效請求,直接拒絕 var response = new ResultResponse();//自定義的返回結果類 message = "無效請求 無參數或參數長度不夠"; response.Status = HttpStatusCode.Forbidden.ToString(); response.Msg = message; return Task.Factory.StartNew<HttpResponseMessage>(() => { return request.CreateResponse(HttpStatusCode.Forbidden, response); }); } //string method = request.Method.ToString(); //Uri uri = request.RequestUri; //HttpContextBase contextBase = (HttpContextBase)request.Properties["MS_HttpContext"]; //HttpRequestBase requestBase = contextBase.Request; //NameValueCollection querycollection = null; //if (requestBase.HttpMethod == "POST") //{ // querycollection = requestBase.Form; //} //if (requestBase.HttpMethod == "GET") //{ // string querys = requestBase.Url.Query.TrimStart('?'); // StringBuilder querybuilder = new StringBuilder(querys); // querycollection = HttpUtility.ParseQueryString(querybuilder.ToString()); //} //合理請求,順利放行 return base.SendAsync(request, cancellationToken).ContinueWith((task) => { HttpResponseMessage resp = task.Result as HttpResponseMessage; return resp; }); } } }
注意,代碼中的關鍵部分我都進行了標紅,而且我刪掉了部分與示例無關的項目代碼,大家重點看標紅的部分代碼應該就大概瞭解了spa
代碼的處理邏輯很簡單:若是身份驗證碼匹配成功,則經過base.SendAsync繼續將請求向下傳遞,不然返回直接中斷請求的傳遞,直接返回一個響應碼爲403的響應,指示沒有權限。
注意因爲SendAsync的返回值須要封裝在Task之中,因此須要使用Task.Factory.StartNew將返回值包含在Task中調試
那麼如今,過濾器部分的邏輯已經算是寫好了,等因而過濾器已經建好了,接下來,就是要把過濾器安裝起來,怎麼安裝呢code
很簡單,在App_Start文件夾下的WebApiConfig裏面,加一句代碼就能夠了
在WebApiConfig.cs裏面的Register方法里加上一句config.MessageHandlers.Add(new Handler.CustomHandler()); 以下圖
這樣一來,過濾器就算是裝載好了,接下來,趕忙模擬請求斷點調試試試效果吧
若是還不行,就試試在HttpApplication.Application_Start中加添加以下語句
GlobalConfiguration.Configuration.MessageHandlers.Add(new Handler.CustomHandler());
HttpApplication.Application_Start方法通常在Global.asax.cs裏
不過要注意的是,若是WebApiConfig中已經加載了一次CustomHandler,這裏就不能再加載,不然CustomHandler會執行兩遍