每当制做一个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会执行两遍