在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
要想解决第二个问题就没这么容易了,我们需要更深入的理解WebAPI的工作方式。 在客户端,Handlers pipeline最终是被传递到HttpClientHandler上的,由他负责HttpRequestMessage到HTTP请求的转换。 这里只说明一下Request,Response与其类似。 (四)解决第二个问题 由 此我们早就可以看出,想要解决第二个问题,可以直接在Handler PipeLine中进行,这种AOP风格的过滤器(拦截器)在REST的Webservice的安全验证中应用很广,一般大家比较乐于在HTTP头或者在HTTP请求的URL中加上身份验证字段进行身份验证,下面举一个在Http头中添加身份验证信息的小例子 4.1客户端
class RequestUpHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { request.Headers.Add("key", "11234"); return base.SendAsync(request, cancellationToken); } }
注:
static void Main(string[] args) { HttpClient client = new HttpClient(new RequestUpHandler() { InnerHandler = new HttpClientHandler() }); HttpResponseMessage response = client.GetAsync("http://localhost:60023/api/FormSubmit").Result; response.Content.ReadAsAsync<string>().ContinueWith((str) => { Console.WriteLine(str.Result); }); Console.Read(); }
客 户端的主程序创建了一个HttpClient,HttpClient可以接受一个参数,该参数就是CustomHandler,此处我们嵌入了我们定义的 RequestUpHandler,用于对Request报头进行嵌入身份验证码的处理,CustomHandler通过InnerHandler属性嵌 入其内置的下一个CustomHandler,此处,由于没有下一个CustomerHandler,我们直接嵌入HttpClientHandler用 于将HttpRequestMessage转化为HTTP 请求、将HTTP响应转化为HttpResponseMessage 4.2服务端
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { int matchHeaderCount = request.Headers.Count((item) => { if ("key".Equals(item.Key)) { foreach (var str in item.Value) { if ("11234".Equals(str)) { return true; } } } return false; }); if (matchHeaderCount>0) { return base.SendAsync(request, cancellationToken); } return Task.Factory.StartNew<HttpResponseMessage>(() => { return new HttpResponseMessage(HttpStatusCode.Forbidden); }); }
注:代码的处理逻辑很简单:如果身份验证码匹配成功,则通过base.SendAsync继续将请求向下传递,否则返回直接中断请求的传递,直接返回一个响应码为403的响应,指示没有权限。 将customHandler注入到HOST中
protected void Application_Start() { //省略其他逻辑代码 GlobalConfiguration.Configuration.MessageHandlers.Add(new HttpUrlHandler()); }
由于WebAPI Host在IIS上,所以HttpServer和HttpControllerDispatcher不用我们手工处理 在加上上面的处理后,如果没有身份验证码的请求,会得到如下的响应 Fobbiden 403 |
请发表评论