webAPI請求消息過濾器
每當制作一個WebAPI,就必然會收到外部很多調用這個API的請求,有時候,我們希望,能從這些外部來的請求中,按照一定條件篩選過濾一下,只將那些我們覺得合法的,有必要回應的請求放進來,一方面擋住那些非法請求,一方面也可以節省服務器應付無效請求的資源
這個時候,我們就需要創建一個過濾器
碰巧,前幾年給之前某家公司做webapi的時候,鉆研過這部分,剛好讓我找到了一個在請求到達controller之前過濾掉的辦法
好了,廢話不多說,直奔主題,這個過濾器的核心就是一個messageHandler,至于它是怎么起到過濾的作用,這方面的原理,我就不詳述了,想知道的同學可以點進下面鏈接
http://www.rzrgm.cn/wk1234/archive/2012/05/07/2486872.html
既然核心是一個messageHandler,那么首先就是要創建一個Handler類,如下圖

我給這個Handler類起名叫CustomHandler(當然叫別的名字也可以,這個隨個人喜好),接下來,就是核心代碼部分
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; }); } } }
注意,代碼中的關鍵部分我都進行了標紅,并且我刪掉了部分與示例無關的項目代碼,你們重點看標紅的部分代碼應該就大概了解了
代碼的處理邏輯很簡單:如果身份驗證碼匹配成功,則通過base.SendAsync繼續將請求向下傳遞,否則返回直接中斷請求的傳遞,直接返回一個響應碼為403的響應,指示沒有權限。
注意由于SendAsync的返回值需要封裝在Task之中,所以需要使用Task.Factory.StartNew將返回值包含在Task中
那么現在,過濾器部分的邏輯已經算是寫好了,等于是過濾器已經建好了,接下來,就是要把過濾器安裝起來,怎么安裝呢
很簡單,在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會執行兩遍

浙公網安備 33010602011771號